创建IHttpActionResult以返回状态代码Accepted

时间:2014-02-27 15:35:33

标签: c# asp.net-web-api http-status-codes

我正在制作一个演示,并想方设法如何最好地完成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,以便将来更简单。

如果这个想法合理,我想得到一些观点,如果我的方式是有道理的,如果没有,那么如何改进。

我的实施可以在下面找到,这是我的问题:

  1. 返回具有任务ID的对象然后是有意义的 设置消费者可以要求的位置标题 状态(如创建状态代码)。
  2. 如何设置 对象的MediaTypeFormatter格式化器反映了什么 消费者在请求中请求。
  3. 做这一切 从设计的角度来看感觉。
  4. 代码:

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

1 个答案:

答案 0 :(得分:1)

是的,这很有道理。即使从RESTful服务架构的角度来看,这也是一种合理的设计 - 使用您概述的操作,客户端通过向特定URI发出POST并返回地址来创建演示站点类型的资源端点提供您遵守RFC建议的相关任务的状态:

  

使用此响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或某个用户​​何时可以期望满足请求的估计。