Web API操作返回类型最佳实践

6
从这个来源:http://www.tutorialsteacher.com/webapi/action-method-return-type-in-web-api,我知道Web API中的Action可以返回以下内容:
  1. void
  2. 基本类型或复杂类型
  3. HttpResponseMessage
  4. IHttpActionResult
我知道每个选项的作用,但我很好奇是否有某种最佳实践,例如始终使用IHttpActionResult作为返回类型,因为它是所有其他选项的超集。
4个回答

2

选项1:返回void、基本类型、复杂类型

优点:

  1. 从签名中清楚地看出返回类型。
  2. 单元测试更容易。

缺点:

  1. 如果出现问题想要返回状态码时不够灵活。

选项2:返回HttpResponseMessage

优点:

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

缺点:

  1. 从签名中无法清楚地看出返回类型。
  2. 单元测试更难,因为必须解包它。(虽然不是很难,但比选项1难)
  3. 涉及更低级别的HTTP状态码和消息构建。

选项3:返回IHttpActionResult

Web API 2.0引入了这个选项。

优点:

  1. 具有选项2的所有优点。
  2. 不涉及更低级别的HTTP状态码和消息构建。

缺点:

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

结论

正如您所看到的,每个选项都有优缺点。对我而言,每个选项的优点都超过了缺点。我的选择是:选项3。但这并不是铁板钉钉的。


在https://learn.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results中指出,`IHttpActionResult`是一个工厂,简化了单元测试。 - MacakM
@MacakM 是的,他们说是这样,但我不知道怎么做。然后当你转到返回IHTTPActionResult的单元测试的链接时,你可以看到它们正在进行强制转换。所以比HttpResponseMessage更容易,但不比选项1更容易。因此,它仍然是一个缺点。 - CodingYoshi

2
我使用 asp.net core,但原则相同。同时,我并不是说这是最好的方法,但对于我来说,这是一个运行得很好的设置。
我总是使用 IActionResult,因为它对我来说最灵活。然后,我的操作方法完全不知道服务返回的DTO。我的做法或多或少是像这样的:
[CustomExceptionsFilter]
[CustomValidateModelFilter]
[Authorize(Roles="whatever")]
public IActionResult ActionMethod(params){
  return Ok(this._myService.whatever());
}

这样,如果您更改服务返回的DTO(尤其是在早期开发阶段经常发生),我根本不需要触及我的控制器。
此外,我有一种统一的返回方式,其中我的自定义异常错误过滤器捕获所有服务层自定义异常,如验证异常、操作异常等... [更新] 在过滤器中,您实际上并不是传统意义上的返回。您更改context.result(它的类型为IActionResult)。所以,假设我的服务抛出了我的自定义MyServiceOperationException("You cannot do that")异常。
我在我的异常过滤器中所做的是:
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 }
          );
      }
}

那么在你的过滤器中,您也会返回 IActionResult 吗?我认为我只能在那里返回 HttpRequestMessage - MacakM
谢谢您的回复,但是在 .NET 中没有 context.Result,只有 context.Response,它是 HttpRequestMessage - MacakM
如果您使用的是“asp mvc web-api”的第一个版本,则必须设置“httpresponsemessage”,但其逻辑仍然相同。 - dee zg
我使用ASP.NET Web API 2,我认为区别只在于ASP.NET和ASP.NET Core之间。 - MacakM

1
"

IActionRsult 非常灵活,您可以返回响应、Json数据或视图。

不仅适用于WepAPI,而且对于任何应用程序来说,最好返回您可以得到的最严格类型。但是,如果控制器中的特定操作可能返回不同的内容,则应使用 IActionResult

"

1
使用IHttpActionResult的优点,以及为什么我总是使用它,是因为它引导你将你的操作视为生成HTTP响应。ASP.NET在混淆广为人知的协议的简单部分方面有着悠久的历史,而在我看来,这是朝着正确方向迈出的一步!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接