【问题标题】:.NET Web API HttpResponseMessage Pattern?.NET Web API HttpResponseMessage 模式?
【发布时间】:2013-12-03 17:12:38
【问题描述】:

所以我已经看到 Web API 2 控制器返回 HttpResponse 和实际对象。示例:

 public HttpResponseMessage Get(string id)
    {
        var app = apps.Single(c => c.Id == id);

        return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ObjectContent<object>(app,
                Configuration.Formatters.JsonFormatter)
        };
    }

 public Application Get(string id)
    {
        return apps.Single(c => c.Id == id);
    }

我的问题是“正确”的方式? #2 要短得多,但最好是做 #1 还是 #2 自动做 #1 ... ?

【问题讨论】:

    标签: asp.net .net asp.net-web-api


    【解决方案1】:

    请参阅 thisthis SO 问题。

    两种情况下的响应都是相同的 (HttpResponseMessage)。

    HttpResponseMessage 允许您使用 HTTP 协议(​​例如,通过 Headers 属性)并统一您的返回类型。

    返回 CLR 类型可能更具可读性,但您会失去返回具有不同状态代码的不同类型的灵活性,除非您使用 dynamicobject,这违背了返回特定类型的目的。

    就个人而言,我更喜欢使用 IHttpActionResult(在 v2 中添加)并在控制器操作上为预期的返回类型指定 ResponseTypeAttribute 以提高可读性。

    [HttpGet]
    [ResponseType(typeof(Portfolio))]
    public IHttpActionResult GetPortfolio([FromUri] long id)
    {
        // get portfolio
    
        return Ok(portfolio);
    }
    

    您可以使用默认的IHttpActionResult 实现(参见上面的OkResult)轻松地操纵响应消息(以RESTful 方式)。避免自己构建HttpResponseMessage 也可以保持代码干净。 HereIHttpActionResult 上的官方文章,hereHttpResponseMessageIHttpActionResult 上的有趣对话。

    【讨论】:

    • 有道理。谢谢!
    • 可以说,你不想让返回不同类型的灵活性;这只是混淆了服务的意图并使其不那么自我记录。 IMO,鉴于两种方法可以产生完全相同的输出,因此代码越少越好。另外,当您需要使用 HTTP 协议时,您总是可以切换到返回 HttpResponseMessage。否则,HttpResponseMessage 方法只会增加混乱。
    • 自记录 API 参数是有意义的,但您可以使用 [ResponseType] 属性向 Swagger 等外部文档发送 API 响应类型信号。我个人比较喜欢return BadRequest()Request.CreateErrorResponse 相比的流畅度。此外,IHttpActionResult 实现可以做的不仅仅是返回一个值(例如添加标题、日志消息等)
    猜你喜欢
    • 2013-12-11
    • 2015-02-21
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2013-11-26
    相关资源
    最近更新 更多