【发布时间】:2014-02-27 15:35:33
【问题描述】:
我正在做一个演示,并弄清楚如何以与我们创建相同的方式最好地执行 IHttpActionResults,好吧,现在 web api 2 中的 badrequest。
[Route("demosite")]
public IHttpActionResult PostCreateDemoSite(CreateDemoSiteModel model)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
var identity = CreateDemoSiteIdentity(model);
Request.GetOwinContext().Authentication.SignIn(identity);
var taskId = Guid.NewGuid();
_provider.SendMessageAsync(new CreateDemoSite{ TaskId = taskId, Name =model.Name, UserId = model.Email);
_provider.SendMessageAsync(
new UserFeedbackMessage
{
UserId = model.Email,
JsonSerializedMessage = JsonConvert.SerializeObject(new { message ="Your site is beging created."})
});
return new ProcessingContentResult(this.Request, Guid.NewGuid );
}
我的应用程序将大量使用这种方法,即发布一些工作/任务,消费者将获得接受,并且必须转到其他端点才能获得他的工作状态。因此,我想创建一个 IHttpActionResult 以便将来更简单。
我想了解一下这个想法是否合理,以及我的做法是否合理,如果不合理,如何改进。
我的实现可以在下面找到,这是我的问题:
- 返回一个带有任务 ID 的对象然后再返回有意义吗? 设置消费者可以要求的位置标头 状态(如已创建状态代码)。
-
如何设置 MediaTypeFormatter 对象的格式化程序,它反映了什么 请求中请求的消费者。 - 做这一切 从设计的角度来看。
代码:
public class ProcessingTask
{
public Guid Id { get; set; }
}
public class ProcessingContentResult : IHttpActionResult
{
HttpRequestMessage _request;
Guid _id;
public ProcessingContentResult(HttpRequestMessage request, Guid id)
{
_id = id;
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage message =
_request.CreateResponse(HttpStatusCode.Accepted,
new ProcessingTask
{
Id = Guid.NewGuid()
});
try
{
message.Headers.Location = new Uri("path_to_status_endpoint");
message.RequestMessage = _request;
}
catch
{
message.Dispose();
throw;
}
return Task.FromResult(message);
}
}
【问题讨论】:
标签: c# asp.net-web-api http-status-codes