【问题标题】:Creating IHttpActionResult for returning status code Accepted为返回状态码创建 IHttpActionResult 已接受
【发布时间】: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 以便将来更简单。

我想了解一下这个想法是否合理,以及我的做法是否合理,如果不合理,如何改进。

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

  1. 返回一个带有任务 ID 的对象然后再返回有意义吗? 设置消费者可以要求的位置标头 状态(如已创建状态代码)。
  2. 如何设置 MediaTypeFormatter 对象的格式化程序,它反映了什么 请求中请求的消费者。
  3. 做这一切 从设计的角度来看。

代码:

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


    【解决方案1】:

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

    与此响应一起返回的实体应包含请求当前状态的指示,以及指向状态监视器的指针或用户可以预期何时完成请求的一些估计。

    【讨论】:

    • 但是我没有返回创建资源的位置!我正在为另一个服务提供一个位置,该服务可以提供当前进程的状态。不是我返回接受而不是创建。您的回答表明您已经阅读了所有内容,因为它是一个已创建的状态代码。
    • 我应该更清楚地表达自己,我希望现在更好。
    猜你喜欢
    • 2018-02-01
    • 2016-09-22
    • 2020-10-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2022-10-23
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多