.NET Web API HttpResponseMessage 模式?
Posted
技术标签:
【中文标题】.NET Web API HttpResponseMessage 模式?【英文标题】:.NET Web API HttpResponseMessage Pattern? 【发布时间】: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 ... ?
【问题讨论】:
【参考方案1】:请参阅 this 和 this SO 问题。
两种情况下的响应都是相同的 (HttpResponseMessage
)。
HttpResponseMessage
允许您使用 HTTP 协议(例如,通过 Headers
属性)并统一您的返回类型。
返回 CLR 类型可能更具可读性,但您会失去返回具有不同状态代码的不同类型的灵活性,除非您使用 dynamic
或 object
,这违背了返回特定类型的目的。
就个人而言,我更喜欢使用 IHttpActionResult
(在 v2 中添加)并在控制器操作上为预期的返回类型指定 ResponseTypeAttribute
以提高可读性。
[HttpGet]
[ResponseType(typeof(Portfolio))]
public IHttpActionResult GetPortfolio([FromUri] long id)
// get portfolio
return Ok(portfolio);
您可以使用默认的IHttpActionResult
实现(参见上面的OkResult
)轻松地操纵响应消息(以RESTful 方式)。避免自己构建HttpResponseMessage
也可以保持代码干净。 Here 是IHttpActionResult
上的官方文章,here 是HttpResponseMessage
与IHttpActionResult
上的有趣对话。
【讨论】:
有道理。谢谢! 可以说,你不想让返回不同类型的灵活性;这只是混淆了服务的意图并使其不那么自我记录。 IMO,鉴于两种方法可以产生完全相同的输出,因此代码越少越好。另外,当您需要使用 HTTP 协议时,您总是可以切换到返回 HttpResponseMessage。否则,HttpResponseMessage 方法只会增加混乱。 自记录 API 参数是有意义的,但您可以使用[ResponseType]
属性向 Swagger 等外部文档发送 API 响应类型信号。我个人比较喜欢return BadRequest()
与Request.CreateErrorResponse
相比的流畅度。此外,IHttpActionResult
实现可以做的不仅仅是返回一个值(例如添加标题、日志消息等)以上是关于.NET Web API HttpResponseMessage 模式?的主要内容,如果未能解决你的问题,请参考以下文章
在调用不同 API 的 APIController 方法中返回 HttpResponse
.NET 4.6 HttpResponse.PushPromise 方法来管理 http/2 PUSH_PROMISE 标头