没有显示从BaseController继承的Web API控制器

本文关键字:Web API 控制器 继承 BaseController 显示 | 更新日期: 2023-09-27 18:04:49

我有一个OWIN,自托管的Web API项目,我想添加Swagger文档和Swagger UI到它。

我已经包括了Swashbuckle。我已经在Startup.cs中手动配置了核心包。

configuration.EnableSwagger(s =>
{
    s.SingleApiVersion(Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.', ' '), "MyApi").;
    s.IncludeXmlComments($@"{System.AppDomain.CurrentDomain.BaseDirectory}'MyApi.XML");
    s.DescribeAllEnumsAsStrings();
})
.EnableSwaggerUi(s =>
{
    // By default, swagger-ui will validate specs against swagger.io's online validator and display the result
    // in a badge at the bottom of the page. Use these options to set a different validator URL or to disable the
    // feature entirely.
    //c.SetValidatorUrl("http://localhost/validator");
    s.DisableValidator();
});

现在,我有一个基本控制器和两个从基本控制器继承的附加控制器。不幸的是,我没有看到控制器的名称和动作在swagger页。

这是我的基本控制器:

public class BaseController : ApiController
{
    public BaseController()
    {
        // Initialization...
    }
    public async Task<IHttpActionResult> MyAction()
    {
        // Code here...
    }
}

Controler1:

public class My1Controller : BaseController
{
    public MyController1(...): base(...)
    {
        // Initialization...
    }
    public async Task<IHttpActionResult> Post(Model1 model)
    {
        // Code here...
    }
    public async Task<IHttpActionResult> Post(Model2 model)
    {
        // Code here...
    }
}

管理员二:

public class My2Controller : BaseController
{
    public My2Controller(...): base(...)
    {
        // Initialization...
    }
    public async Task<IHttpActionResult> Post(Model1 model)
    {
        // Code here...
    }
    public async Task<IHttpActionResult> Post(Model2 model)
    {
        // Code here...
    }
}

我看不到My1ControllerMy2Controller在swagger索引页。我已经尝试了My1ControllerMy2Controller上的ApiExplorerSettings(IgnoreApi = true)]属性,但没有发生任何事情。

是因为控制器动作共享共同的名称(多个Post动作与不同的参数类型)?我没有像上面的例子那样使用rpc风格的url,而是使用RESTful url,遵循5级媒体类型(5LMT)建议。

任何建议吗?

没有显示从BaseController继承的Web API控制器

. NET Web API使用命名约定,这意味着您的控制器不会被解析,因为它们的名称没有以Controller结尾。

这意味着MyController1变成了My1Controller

因此,作为一个例子,将MyController1更改为以下将工作:
public class My1Controller : BaseController
{
    public MyController1(...): base(...)
    {
        // Initialization...
    }
    public async Task<IHttpActionResult> Post(Model1 model)
    {
        // Code here...
    }
    public async Task<IHttpActionResult> Post(Model2 model)
    {
        // Code here...
    }
}

我认为你必须以不同的方式命名路由,这样它们就不会有共享方法的命名冲突。

添加属性

[ApiExplorerSettings(IgnoreApi=true)]

到你的基本控制器属性

[Route("/My1Service")]
[ServiceName("My1Service")]
[ApiVersion("1.0")]

[HttpPost(nameof(StoreCardPaymentMethod))]

到每个方法或者类似的东西

你不能看到它们的原因是因为swashbuckle只读取ApiCOntrollers,除了OdataController之外的任何apicontroller都必须由开发人员在自定义文档过滤器的帮助下添加。这里有n个例子https://github.com/domaindrivendev/Swashbuckle/blob/master/README.md