Web API操作返回类型最佳做法

时间:2017-10-14 17:37:58

标签: c# asp.net-web-api

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

  1. 空隙
  2. 原始类型或复杂类型
  3. HttpResponseMessage
  4. IHttpActionResult
  5. 我知道每个选项的作用,但我很好奇是否有一些最佳实践,例如总是使用IHttpActionResult作为返回类型,因为它是所有其他选项的超集。

4 个答案:

答案 0 :(得分:1)

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

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

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

这样,如果您更改服务返回的DTO(这种情况很快发生,特别是在早期开发阶段),我就不会这样做。至少要触摸我的控制器。

此外,我有几乎统一的方式返回我的自定义异常错误过滤器捕获所有服务层自定义异常,如验证异常,操作异常等...

<强> [UPDATE]

在过滤器中,您实际上并不是传统意义上的回归。您宁可设置context.resultIActionResult类型)。所以,假设我的服务引发了我的自定义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 }
          );
      }
}

答案 1 :(得分:1)

IActionRsult非常灵活,只能返回响应,Json数据或视图。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

选项1:返回void,Primitive类型,复杂类型

优点:

  1. 从签名中清除什么是返回类型。
  2. 单元测试更容易。
  3. 缺点:

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

      优点:

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

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

          Web API 2.0引入了这个。

          优点:

          1. 选项2的所有优点
          2. 它与较低级别的http状态代码和消息构造无关。
          3. 缺点:

            1. 除了con 3之外,选项2的所有缺点。
            2. <强>结论

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

相关问题