C# Web API操作返回类型最佳实践
来源:我得到,Web API中的操作可以返回:C# Web API操作返回类型最佳实践,c#,asp.net-web-api,C#,Asp.net Web Api,来源:我得到,Web API中的操作可以返回: 空虚 基本类型还是复杂类型 HttpResponseMessage IHttpActionResult 我知道每个选项的作用,但我很好奇是否有一些最佳实践,例如始终使用IHttpActionResult作为返回类型,因为它是所有其他选项的超集。我使用asp.net core,但原理是相同的。另外,不是说这是最好的方法,但对我来说,这是一个非常好的设置 我总是使用IActionResult作为我最灵活的选择。然后,我可以让动作方法完全不知道我的服务(
我知道每个选项的作用,但我很好奇是否有一些最佳实践,例如始终使用IHttpActionResult作为返回类型,因为它是所有其他选项的超集。我使用
asp.net core
,但原理是相同的。另外,不是说这是最好的方法,但对我来说,这是一个非常好的设置
我总是使用IActionResult
作为我最灵活的选择。然后,我可以让动作方法完全不知道我的服务(动作方法调用的)返回的DTO
s。我所做的只是,或多或少,像这样:
[CustomExceptionsFilter]
[CustomValidateModelFilter]
[Authorize(Roles="whatever")]
public IActionResult ActionMethod(params){
return Ok(this._myService.whatever());
}
这样,如果您将dt更改为服务返回的(这种情况经常发生,尤其是在早期开发阶段),我根本不必触摸我的控制器
此外,我有一种非常统一的返回方式,其中我的自定义异常错误过滤器捕获所有服务层自定义异常,如验证异常、操作异常等
[更新]
在过滤器中,您实际上不会以传统的方式返回。您应该设置上下文.result
(类型为IActionResult
)。所以,假设我的服务抛出我的自定义MyServiceOperationException(“您不能这样做”)
exception
我在异常过滤器中执行的操作是:
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
将是一种方法。IHttpActionResult的优点,以及为什么我总是使用它,它引导您将您的操作视为生成HTTP响应。ASP.NET在混淆广泛理解的协议的简单部分方面有着悠久的历史,我认为这是朝着正确方向迈出的一步 选项1:返回void、基本类型、复杂类型
优点:
从签名中清除返回类型李>
单元测试更容易
缺点:
如果您想在出现问题时返回状态码,则不灵活
选项2:返回HttpResponseMessage
优点:
可灵活返回选项1中的所有项目
如果需要,还可以返回状态代码
缺点:
从签名中不清楚返回类型是什么
单元测试更难,因为您必须打开它。(不是那么难,而是比选项1更难)
关注较低级别的http状态代码和消息构造
选项3:返回IHttpActionResult
WebAPI2.0介绍了这一点
优点:
选项2的所有优点
它不关心较低级别的http状态代码和消息构造
缺点:
除con 3外,选项2的所有con
结论
正如您所看到的,每个选项都有利弊。对我来说,每种选择的好处都大于坏处。我的选择是:方案3。但是它不是一成不变的。所以在过滤器中,您还可以返回IActionResult
?我以为我只能返回HttpRequestMessage
谢谢你,但是在.NET中没有context.Result
,只有context.Response
是HttpRequestMessage
对,如果您使用第一个版本的asp mvc web api
,那么您必须设置httpresponsemessage
,但其逻辑仍然相同。我使用asp.NET web api 2,我认为区别仅在于asp.NET和asp.NET CoreIn之间的区别,IHttpActionResult
简化了单元测试,因为它是一个Factory@MacakM是的,他们这么说,但我不知道怎么说。然后,当您在返回IHTTPActionResult
的单元测试中转到时,您可以看到它们正在转换。因此,是的,比HttpResponseMessage容易,但不比选项1容易。因此,这仍然是一个骗局。