Swashbuckle - 未显示继承自BaseController的Web API控制器

时间:2016-08-30 14:28:39

标签: c# asp.net-web-api swagger swagger-ui swashbuckle

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

我已经包含了Swashbuckle.Core包,我在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();
});

现在,我有一个基本控制器和两个从基础继承的附加控制器。不幸的是,我没有在招摇页面中看到控制器的名称和行为。

这是我的基本控制器:

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...
    }
}

控制器2:

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...
    }
}

我无法在swagger索引页面中看到My1ControllerMy2Controller。我在ApiExplorerSettings(IgnoreApi = true)]My1Controller上尝试了My2Controller属性但未发生任何事情。

是否因为控制器操作共享通用名称(具有不同参数类型的多个Post操作)?我没有像上面的例子那样使用RPC样式的URL,而是使用RESTful URL,遵循5级媒体类型(5LMT)提议。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我相信您必须以不同的方式命名路由,以便它们不会对共享方法命名冲突。

添加属性

[ApiExplorerSettings(IgnoreApi=true)]

给您的基本控制器 和属性

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

[HttpPost(nameof(StoreCardPaymentMethod))]

每种方法之类的

答案 1 :(得分:0)

你无法看到它们的原因是因为swashbuckle只读取ApiCO控制器,除此之外的任何东西,例如OdataController,必须由开发人员在自定义文档过滤器的帮助下添加。这是一个例子 https://github.com/domaindrivendev/Swashbuckle/blob/master/README.md

答案 2 :(得分:0)

ASP.NET Web API与naming conventions一起使用,这意味着您的控制器不会被解析,因为它们的名称不会以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...
    }
}