16

Web API 中针对操作方法的返回类型的一般做法是什么?

像这样返回 CLR 对象:

public IEnumerable<ContactModel> Get()
{
    return _contactService.GetAllForUser();
}

或将您的对象包装在HttpResponseMessage

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

    return Request.CreateResponse((HttpStatusCode) 200, contacts);
}

我更喜欢将我自己的 CLR 对象作为返回类型,因为它显然会产生更简洁的方法,因为您不必HttpResponseMessage每次都在实例化 a 时搞砸。

4

2 回答 2

18

这里重要的一点是,这个选择是PREFERENCE的问题。如果您正在创建一个“URI 样式”HTTP api,其中返回类型是客户端预先知道的,那么这可能是您的首选方法。

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

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

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

我没有兴趣说服希望返回 CLR 类型进行更改的人,我只是想再次向喜欢返回 HttpResponseMessage 想法的人保证,尽管您不会看到很多示例,但它是一个完全可行的选择那。

于 2012-09-04T14:55:44.290 回答
4

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

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

throw new HttpResponseException(
    Request.CreateResponse<string>(HttpStatusCode.BadRequest, 'Your message'))
于 2012-09-04T13:09:46.137 回答