2015-08-12 4 views
2

У меня есть веб-api (написанный на C# в ASP.NET Web API 2). Один из методов принимает HTTP POST и добавляет его в Azure Queue.Как вернуть коды статуса HTTP из Azure Queue в C# ASP.NET Web API 2

Я хотел бы знать, как я могу получить код статуса http (или все, что доступно) из очереди Azure, чтобы я мог вернуть соответствующий код состояния http из моего метода.

код до сих пор похож на это:

[Route("api/v1/somewhere/")] 
     [ResponseType(typeof(Thingy))] 
     public async Task<IHttpActionResult> Post(Thingy thingy) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureWebJobsStorage"].ToString()); 
      var queueClient = storageAccount.CreateCloudQueueClient(); 
      var queue = queueClient.GetQueueReference("thingys"); 

      var msg = new CloudQueueMessage(JsonConvert.SerializeObject(thingy)); 
      await queue.AddMessageAsync(msg); 

      return Json(thingy); 
     } 

Я хотел бы поменять на return Json(thingy); строки и возвращает код 202 состояния HTTP, если все пойдет хорошо с await queue.AddMessageAsync(msg); и если что-то другим соответствующим кодом идет не так.

Любые идеи?

+0

я добавил ответ ниже, пожалуйста, дайте мне знать, если это решить вашу проблему –

ответ

2

Вы должны использовать LastResult свойство OperationContext объекта , Он имеет свойство HttpStatusCode, которое вернет код состояния из Storage Service. Вот пример того же:

static void QueueTest1() 
    { 
     var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); 
     var queueClient = account.CreateCloudQueueClient(); 
     var queue = queueClient.GetQueueReference("my-queue"); 
     queue.CreateIfNotExists(); 
     var messageContents = "This is a test message"; 
     var opContext = new OperationContext(); 
     var msg = new CloudQueueMessage(messageContents); 
     queue.AddMessage(msg, null, null, null, opContext); 
     var statusCode = opContext.LastResult.HttpStatusCode; 
     Console.WriteLine("Status Code = " + statusCode);//Prints 201 as status code 
     queue.DeleteIfExists(); 
    } 
0

Заканчивать эту страницу: http://bitoftech.net/2014/03/05/new-asp-net-web-api-2-ihttpactionresult-cors-tutorial/

Я думаю, вы должны wrapp ответ вы хотите в вашем собственном классе, что-то вроде этого:

public class MyResponse : IHttpActionResult 
{ 
    public string Message { get; private set; } 
    public HttpRequestMessage Request { get; private set; } 


    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     return Task.FromResult(ExecuteResult()); 
    } 

    public HttpResponseMessage ExecuteResult() 
    { 
     HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Accepted); 

     response.Content = new StringContent(Message); 
     response.RequestMessage = Request; 
     return response; 
    } 
} 
+0

Я счастлив с возвращением прямой HttpStatusCode.Accepted, я просто хотел проверить, что объект был создан в Azure Queue, поэтому он смотрел, как получить код состояния HTTP из очереди Azure. Тогда я мог бы условно вернуть код 202, чтобы клиенты API, использующие мой код, знали, что запрос был в основном принят, но не полностью обработан. Но я вижу, что это было бы полезно, если бы я хотел вернуть сообщение вместе со кодом состояния :) –

+0

Я вижу, но это браузер с другой стороны или другого приложения? Поскольку, если вы вернете код 202, браузер не отправит другой запрос (если только вы не обработали его с помощью JS, ajax и т. Д.), Чтобы получить ответ, когда исходный запрос был обработан. Есть ли что-то, что мне не хватает? –

+0

не глядя только на поддержку сети. Я хочу 202, так как другая сторона очереди не обрабатывается немедленно (веб-работа на Azure). Так что я не хочу, чтобы клиент висел за другой ответ :) –