Web API Action返回类型最佳实践

从这个来源: http : //www.tutorialsteacher.com/webapi/action-method-return-type-in​​-web-api我得到了,Web API中的Action可以返回:

  1. 空虚
  2. 原始类型或复杂类型
  3. HttpResponseMessage
  4. IHttpActionResult

我知道每个选项的作用,但我很好奇是否有一些最佳实践,例如总是使用IHttpActionResult作为返回类型,因为它是所有其他选项的超集。

我使用asp.net core但原理是一样的。 此外,不是说这是最好的方式,但对我来说这是非常好的设置。

我总是使用IActionResult对我来说最灵活。 然后,我可以完全不知道我的服务(操作方法调用)返回的DTO的操作方法。 我做的或多或少都是这样的:

 [CustomExceptionsFilter] [CustomValidateModelFilter] [Authorize(Roles="whatever")] public IActionResult ActionMethod(params){ return Ok(this._myService.whatever()); } 

这样,如果您更改服务返回的DTO (这种情况很多,尤其是在早期开发阶段),我根本不会触摸我的控制器。

此外,我有几乎统一的方式返回我的自定义exception错误filter捕获所有服务层自定义exception,如validationexception,操作exception等…

[UPDATE]

在filter中,你实际上并没有传统意义上的回归。 您宁愿设置您的context.result (类型为IActionResult )。 所以,假设我的服务抛出了我的自定义MyServiceOperationException("You cannot do that")exception。

我在我的exceptionfilter中做的是:

 public override void OnException(ExceptionContext context) { if (context.Exception is MyServiceOperationException) { context.Result = new BadRequestObjectResult(new MyErrorResult(){ Message = context.Exception.Message, Code=context.Exception.MyErrorCode } ); } } 

IActionRsult在返回响应,Json数据或视图方面非常灵活。

不仅对于WepAPI,而且对于任何应用程序,最好返回可以逃脱的最严格类型,但同样,如果控制器中的特定操作可能返回不同的东西, IActionResult将是IActionResult的方法。

IHttpActionResult的优点以及我一直使用它的原因在于它引导您将您的操作视为生成HTTP响应。 ASP.NET对于广泛理解协议的简单部分有着悠久的历史,在我看来,这是朝着正确方向迈出的一步!

选项1:返回void,Primitive类型,Complex类型

优点:

  1. 从签名中清除什么是返回类型。
  2. unit testing更容易。

缺点:

  1. 如果您想在出现问题时返回状态代码,则不灵活。

选项2:返回HttpResponseMessage

优点:

  1. 灵活地返回选项1中的所有项目
  2. 如果需要,还可以返回状态代码。

缺点:

  1. 从签名中不清楚返回类型是什么。
  2. unit testing更难,因为你必须打开它。 (不是比选项1更难但更难)
  3. 关注较低级别的http状态代码和消息构造。

选项3:返回IHttpActionResult

Web API 2.0引入了这一点。

优点:

  1. 选项2的所有优点
  2. 它不涉及较低级别的http状态代码和消息构造。

缺点:

  1. 除了con 3之外,选项2的所有缺点。

结论

正如您所看到的,每个选项都有利有弊。 对我来说,每个选项的优点都超过缺点。 我的选择是:选项3.但它不是一成不变的。