Web API Action返回类型最佳实践
从这个来源: http : //www.tutorialsteacher.com/webapi/action-method-return-type-in-web-api我得到了,Web API中的Action可以返回:
- 空虚
- 原始类型或复杂类型
- HttpResponseMessage
- 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类型
优点:
- 从签名中清除什么是返回类型。
- unit testing更容易。
缺点:
- 如果您想在出现问题时返回状态代码,则不灵活。
选项2:返回HttpResponseMessage
优点:
- 灵活地返回选项1中的所有项目
- 如果需要,还可以返回状态代码。
缺点:
- 从签名中不清楚返回类型是什么。
- unit testing更难,因为你必须打开它。 (不是比选项1更难但更难)
- 关注较低级别的http状态代码和消息构造。
选项3:返回IHttpActionResult
Web API 2.0引入了这一点。
优点:
- 选项2的所有优点
- 它不涉及较低级别的http状态代码和消息构造。
缺点:
- 除了con 3之外,选项2的所有缺点。
结论
正如您所看到的,每个选项都有利有弊。 对我来说,每个选项的优点都超过缺点。 我的选择是:选项3.但它不是一成不变的。