ASP.NET Web API - 返回CLR对象或HttpResponseMessage

jcv*_*dan 15 .net c# asp.net-web-api

对于动作方法的返回类型,Web API中的一般做法似乎是什么?

像这样返回CLR对象:

public IEnumerable<ContactModel> Get()
{
    return _contactService.GetAllForUser();
}
Run Code Online (Sandbox Code Playgroud)

或者将对象包装在HttpResponseMessage:

public HttpResponseMessage Get()
{
    IEnumerable<ContactModel> contacts = _contactService.GetAllForUser();

    return Request.CreateResponse((HttpStatusCode) 200, contacts);
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢将自己的CLR对象作为返回类型,因为它显然会产生更干净的方法,因为您不必HttpResponseMessage每次都实例化.

Dar*_*ler 17

这里重要的一点是,这种选择是一个偏好的问题.如果您正在创建一个"URI样式"HTTP api,其中返回类型已经提前由客户端知道,那么这可能是您首选的方法.

但是,就个人而言,我不喜欢返回CLR类型.我相信通过采用这种方法,您可能会失去HTTP的许多好处.我总是返回HttpResponseMessage.

如果考虑标准过程调用,则有两种可能的结果,即返回返回类型或获得异常.HTTP交互比重定向,临时不可用服务器,无内容,未修改,服务器连接,首选标头变体等更灵活.

我认为ApiController类是您的应用程序有机会将面向对象的方法调用映射到HTTP请求/响应的地方.我认为这种映射明确有助于利用HTTP.让框架神奇地将CLR类型转换为某种线表示,确实可以节省一些输入,但它会模糊正在发生的事情,并迫使您通过ActionFilters和MessageHandler间接地进行任何类型的HTTP交互.

我没有兴趣说服那些更喜欢返回CLR类型的人改变,我只想重新向那些喜欢返回HttpResponseMessage的人保证这是一个完全可行的选择,尽管事实上你不会看到很多样本那.

  • +1使用HttpResponseMessage的一个好处是,在出现错误请求或服务器错误的情况下,您可以返回"错误类型",而不必尝试将错误添加到空CLR对象,因为您与该特定关联返回类型. (2认同)
  • @ user3241191将元数据添加到返回正文中是多余的.HTTP标头旨在将元添加到邮件中.发明您自己的元数据约定是浪费精力,并且如果需要,将严重限制您与其他系统集成的能力. (2认同)

Cla*_*edi 4

我认为第一个选择是最好的。无论如何,如果没有错误,返回代码将为 200,无需您进行任何设置。

如果有任何异常,您可以抛出HttpResponseException带有适当代码和消息的异常

throw new HttpResponseException(
    Request.CreateResponse<string>(HttpStatusCode.BadRequest, 'Your message'))
Run Code Online (Sandbox Code Playgroud)