问题 asp.net webapi控制器,返回类型实体或HttpResponseMessage


我想知道在我的ApiController中使用HttpResponseMessage作为返回类型有什么好处?比较直接返回键入的实体或集合。

我们试图确定一个实践,以保持我们正在进行的项目的一致性。


6530
2018-04-09 19:30


起源



答案:


返回 HttpResponseMessage 当您尝试将控制器层用作HTTP协议与内部.Net服务之间的转换时非常有用。它允许直接控制HTTP有效负载和标头。它可以很容易地返回202,204,304,303响应。它可以轻松设置缓存标头。您可以明确控制响应的媒体类型。

通过返回对象,您可以有效地向架构中添加“不执行任何操作”层。考虑....

public Foo Get(int id) {
   return _fooRepository.GetFoo(id)
}

这种方法的目的是什么?它增加了什么价值?至少在MVC领域,控制器具有匹配模型和视图的作用。

当您从APIController返回对象时,您必须使用一组特定于Web API / MVC的抽象来间接影响HTTPResponseMessage,并且在HTTP世界中没有相应的概念。 Formatters,ActionFilters,ModelBinders,HttpResponseException都是基础结构,旨在允许框架在后台处理您的HTTP请求和响应消息。

直接返回HttpResponseMessage需要您的控制器方法完成返回所需HTTP消息所需的工作。

我不相信它会给你的应用程序增加任何复杂性,它只会使正在发生的事情变得可见。

这取决于您是否要将Web API用作“通过HTTP远程对象”框架(在这种情况下,我还将查看ServiceStack),或者您是否希望利用HTTP作为应用程序协议。


13
2018-04-09 20:15



我完全同意,也许是为了分离关注为什么没有服务层(强类型方法)和web服务层(ASP.NET WEB API),因此Winform,WPF,控制台和测试项目可以轻松地使用服务层并暴露作为ASPNET WebAPi的Web服务 - riadh gomri


答案:


返回 HttpResponseMessage 当您尝试将控制器层用作HTTP协议与内部.Net服务之间的转换时非常有用。它允许直接控制HTTP有效负载和标头。它可以很容易地返回202,204,304,303响应。它可以轻松设置缓存标头。您可以明确控制响应的媒体类型。

通过返回对象,您可以有效地向架构中添加“不执行任何操作”层。考虑....

public Foo Get(int id) {
   return _fooRepository.GetFoo(id)
}

这种方法的目的是什么?它增加了什么价值?至少在MVC领域,控制器具有匹配模型和视图的作用。

当您从APIController返回对象时,您必须使用一组特定于Web API / MVC的抽象来间接影响HTTPResponseMessage,并且在HTTP世界中没有相应的概念。 Formatters,ActionFilters,ModelBinders,HttpResponseException都是基础结构,旨在允许框架在后台处理您的HTTP请求和响应消息。

直接返回HttpResponseMessage需要您的控制器方法完成返回所需HTTP消息所需的工作。

我不相信它会给你的应用程序增加任何复杂性,它只会使正在发生的事情变得可见。

这取决于您是否要将Web API用作“通过HTTP远程对象”框架(在这种情况下,我还将查看ServiceStack),或者您是否希望利用HTTP作为应用程序协议。


13
2018-04-09 20:15



我完全同意,也许是为了分离关注为什么没有服务层(强类型方法)和web服务层(ASP.NET WEB API),因此Winform,WPF,控制台和测试项目可以轻松地使用服务层并暴露作为ASPNET WebAPi的Web服务 - riadh gomri