我正在制作一个演示,并想方设法如何最好地完成IHttpActionResults,就像我们创建的那样,ok,badrequest现在在web api 2中。
[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,以便将来更简单。
如果这个想法合理,我想得到一些观点,如果我的方式是有道理的,如果没有,那么如何改进。
我的实施可以在下面找到,这是我的问题:
代码:
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);
}
}
答案 0 :(得分:1)
是的,这很有道理。即使从RESTful服务架构的角度来看,这也是一种合理的设计 - 使用您概述的操作,客户端通过向特定URI发出POST
并返回地址来创建演示站点类型的资源端点提供您遵守RFC建议的相关任务的状态:
使用此响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或某个用户何时可以期望满足请求的估计。