【问题标题】:How to Return HTTP Status Codes from Azure Queue's in C# ASP.NET Web API 2如何在 C# ASP.NET Web API 2 中从 Azure 队列返回 HTTP 状态代码
【发布时间】:2015-08-12 08:45:07
【问题描述】:

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

我想知道如何从 Azure 队列中获取 http 状态码(或任何可用的),以便我可以从我的方法中返回适当的 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);
        }

如果await queue.AddMessageAsync(msg); 一切顺利,我想换掉return Json(thingy); 行并返回http 状态代码202,如果出现问题,则返回另一个适当的代码。

有什么想法吗?

【问题讨论】:

  • 我在下面添加了一个答案,如果它解决了你的问题,请告诉我

标签: c# azure asp.net-web-api asp.net-web-api2 azure-queues


【解决方案1】:

您应该使用OperationContext 对象的LastResult 属性。它有一个HttpStatusCode 属性,它将从存储服务返回状态代码。这是一个相同的例子:

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

【讨论】:

    【解决方案2】:

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

    我认为你应该在你自己的类中包装你想要的响应,像这样:

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

    【讨论】:

    • 我很高兴返回一个直接的 HttpStatusCode.Accepted,我只是想检查一个实体是否已在 Azure 队列中创建,因此正在研究如何从 Azure 队列获取 HTTP 状态代码.然后我可以有条件地返回一个代码 202,以便使用我的代码的 API 客户端知道该请求已被主要接受但未完全处理。但是我可以看到,如果我想连同状态码一起返回一条消息,这会很有用:)
    • 我明白了,但它是另一端的浏览器还是其他应用程序?因为如果您返回 202 代码,浏览器将不会发送另一个请求(除非您使用 JS、ajax 等处理它)以在处理原始请求时获得响应。有什么我想念的吗?
    • 不只是为了支持网络。我想要一个 202,因为队列的另一端不会立即处理(Azure 上的 Web 作业)。所以我不希望客户四处寻找另一个回应:)
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 2018-03-29
    • 2022-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多