如何在 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();
}
我有一个网站 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();
}