【问题标题】:Common ApiController Base Class with Swagger带有 Swagger 的通用 ApiController 基类
【发布时间】:2018-10-03 09:54:28
【问题描述】:

所以我实现了我的第一个 REST API 应用程序,一切正常,包括 Swagger(我使用了 Swashbuckle 并且可以测试我的 API)

在我阅读的文档中,“...控制器必须从 ApiController... 扩展”。我明白了。但是,我应该如何理解这种说法?我想要做的是避免在我的每个 ApiController 扩展中复制代码。例如,我有两个控制器 - ProductControllerDeviceController - 两者都扩展了 ApiController。我创建了类BaseController 扩展ApiController。然后我将产品控制器和设备控制器的基类更改为基本控制器

public class BaseController : ApiController
{
}

public class ProductController : BaseController // ApiController
{
}

public class DeviceController : BaseController // ApiController
{
}

1) 一旦我点击 /swagger URL,Swagger 应用程序就会出错。 2) 我真的不希望我的BaseController 服务于任何请求。我想要的只是拥有可以在所有控制器中使用的通用辅助方法,例如ProductControllerDeviceController

任何建议表示赞赏。

【问题讨论】:

  • 应该可以工作。如果您需要有关 Swagger 错误的帮助,edit 您的问题包括 Swagger 错误以及您的研究。
  • 继承并不是重用代码的最佳方式。 ASP.NET Core、MVC、Web API,都提供了通过过滤器添加可重用功能的方法。
  • 创建自己的基类应该可以工作。如果您不希望它被实例化,您应该声明它abstract。也许更好的方法是创建可以由任何控制器调用的 C# 扩展方法?或者把那些常用的方法放在“helper”或“utility”类中,在需要时可以使用?
  • 好吧,我把我的 BaseController 抽象化了,这就成功了。谢谢!

标签: c# .net rest swagger webapi2


【解决方案1】:

尝试在控制器级别使用@ApiIgnore 注解。

   [ApiExplorerSettings(IgnoreApi = true)]
    public class BaseController : ApiController
    {
    }

【讨论】:

  • 更容易使类抽象
  • 当然。有不同的方法。是的,让类更容易抽象
  • 是的,就像我上面说的那样,制作基础摘要解决了我的招摇问题。不过很高兴了解 @ApiIgnore 属性以供将来参考。
  • [ApiExplorerSettings(IgnoreApi = true)] 隐藏了我所有从基类继承的类。让它abstract 解决了我的问题
【解决方案2】:

在我的情况下,[ApiExplorerSettings(IgnoreApi = true)] 也删除了所有继承的控制器。

我必须使用[NonAction] 过滤器标记基本控制器中的方法,如下所述:https://stackoverflow.com/a/63845979/218408

点网 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2021-04-06
    • 1970-01-01
    • 2017-04-05
    • 2019-11-06
    • 2023-03-18
    相关资源
    最近更新 更多