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

C# Web API操作返回类型最佳实践,c#,asp.net-web-api,C#,Asp.net Web Api,来源:我得到,Web API中的操作可以返回: 空虚 基本类型还是复杂类型 HttpResponseMessage IHttpActionResult 我知道每个选项的作用,但我很好奇是否有一些最佳实践,例如始终使用IHttpActionResult作为返回类型,因为它是所有其他选项的超集。我使用asp.net core,但原理是相同的。另外,不是说这是最好的方法,但对我来说,这是一个非常好的设置 我总是使用IActionResult作为我最灵活的选择。然后,我可以让动作方法完全不知道我的服务(

来源:我得到,Web API中的操作可以返回:

  • 空虚
  • 基本类型还是复杂类型
  • HttpResponseMessage
  • IHttpActionResult

  • 我知道每个选项的作用,但我很好奇是否有一些最佳实践,例如始终使用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容易。因此,这仍然是一个骗局。