没有显示从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...
}
}
我看不到My1Controller
和My2Controller
在swagger索引页。我已经尝试了My1Controller
和My2Controller
上的ApiExplorerSettings(IgnoreApi = true)]
属性,但没有发生任何事情。
是因为控制器动作共享共同的名称(多个Post
动作与不同的参数类型)?我没有像上面的例子那样使用rpc风格的url,而是使用RESTful url,遵循5级媒体类型(5LMT)建议。
任何建议吗?
. 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