如何解决Swagger版本控制-在satartup的document.basePath中设置v {version:apiVersion},而不是在控制器中设置Route属性
最近,我遇到了一个小问题,我想解决一个关于为我的API之一生成的api文档的问题。
我偶然发现的问题与Azure API管理正在阅读我的招摇的文档并在门户中自动设置API的方式有关。
详细地,我注意到,每次我更新涉及将更新的swagger文档导入门户网站的API时,我的基址都会消失,并且作为API作为我的多个版本的API的文档,会出现版本“前缀”在API管理的后缀而不是基本URL的一部分。
这反过来导致APIM URL中有多个版本标识符,而不是一个。 示例:
[WEB APP RESOURCE BASE URL]/v1/[Controller]/[Action]
将APIM转换为:
[APIM API BASE URL]/v1/v1/[Controller]/[Action]
我设法通过在“启动类”的“ PreSerrializefilters”中添加“主机”来解决基址消失的问题:
app.UseSwagger(c =>
{
c.PreSerializefilters.Add((document,request) =>
{
document.Host = request.Host.Value;
document.Paths = document.Paths.ToDictionary(p => p.Key.ToLowerInvariant(),p => p.Value);
});
});
下一步是通过向文件管理器添加“ basePath”属性,尝试将版本前缀从控制器中的Rout属性移动到启动类中的PreSerializefilters。
因此,从我的路线属性中删除“ v {version:apiVersion}” ...
[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("v{version:apiVersion}/[controller]/[action]")]
[Produces("application/json","application/xml")]
导致...
[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("/[controller]/[action]")]
[Produces("application/json","application/xml")]
,然后在启动类的“ PreSerializefilters”中添加“ basePath”:
app.UseSwagger(c =>
{
c.PreSerializefilters.Add((document,request) =>
{
document.Host = request.Host.Value;
document.BasePath = "/" + document.Info.Version;
document.Paths = document.Paths.ToDictionary(p => p.Key.ToLowerInvariant(),p => p.Value);
});
});
因此,在完成所有操作后,所有内容似乎都设置正确,但是当从招摇的门户网站和邮递员发送请求时,api似乎混淆了,或者完全无法正确路由请求,正如您在最后一个代码段中所看到的那样下图显示了“ v1”请求,尝试输入“ v2”操作并失败,导致未找到“ 404”:
有人知道如何正确设置吗?
有关我使用的更多信息是:
- .Net Core 2.1
- Swashbuckle.AspNetCore.Swagger(4.0.1)
- Swashbuckle.AspNetCore.Annotations(4.0.1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。