如何在 C# ASP.NET Web API 2 中 Return 来自 Azure 队列的 HTTP 状态代码

How to Return HTTP Status Codes from Azure Queue's in C# ASP.NET Web API 2

我有一个网站 api(在 ASP.NET 网站 API 2 上用 c# 编写)。其中一种方法采用 HTTP POST 并将其添加到 Azure 队列。

我想知道如何从 Azure 队列中获取 http 状态代码(或任何可用的代码),以便我可以 return 从我的方法中获取适当的 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); 行和 return 一个 http 状态代码 202(如果一切正常的话 await queue.AddMessageAsync(msg); 和另一个适当的代码,如果出现问题)。

有什么想法吗?

查看此页面: http://bitoftech.net/2014/03/05/new-asp-net-web-api-2-ihttpactionresult-cors-tutorial/

我认为你应该把你想要的回复包装在你自己的 class 中,像这样:

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;
    }
}

您应该使用 LastResult property of OperationContext object. It has a HttpStatusCode 属性 它将 return 来自存储服务的状态代码。这是相同的示例:

    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();
    }