Asp.net core Swagger版本控制-在satartup中的document.basePath中设置v{version:apiVersion},而不是在控制器中设置Route属性
我最近遇到了一个小问题,我想解决一个关于我的一个API的自大生成API文档的问题 我偶然发现的问题与Azure API管理阅读我的招摇过市文档并在门户中自动设置API的方式有关 详细地说,我注意到,每次我更新API时,如果需要将更新后的swagger文档导入门户,我的基本地址就会消失,而作为API多个版本的文档,版本“前缀”会出现在API管理中的后缀上,而不是基本URL的一部分 这反过来会导致APIM URL中出现多个版本标识符,而不是一个。 例如: 将APIM转换为:Asp.net core Swagger版本控制-在satartup中的document.basePath中设置v{version:apiVersion},而不是在控制器中设置Route属性,asp.net-core,swagger,azure-api-management,swashbuckle.aspnetcore,Asp.net Core,Swagger,Azure Api Management,Swashbuckle.aspnetcore,我最近遇到了一个小问题,我想解决一个关于我的一个API的自大生成API文档的问题 我偶然发现的问题与Azure API管理阅读我的招摇过市文档并在门户中自动设置API的方式有关 详细地说,我注意到,每次我更新API时,如果需要将更新后的swagger文档导入门户,我的基本地址就会消失,而作为API多个版本的文档,版本“前缀”会出现在API管理中的后缀上,而不是基本URL的一部分 这反过来会导致APIM URL中出现多个版本标识符,而不是一个。 例如: 将APIM转换为: [APIM API BA
[APIM API BASE URL]/v1/v1/[Controller]/[Action]
我通过在我的Startup类中的“preserializefilters”中添加“host”来解决基址消失的问题:
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”属性,尝试将版本前缀从控制器中的“路由”属性移动到启动类中的预初始化过滤器
所以从我的路由属性中删除“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")]
然后将“basePath”添加到我的startup类中的“PreSerializeFilters”中:
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);
});
});
因此,完成此操作后,一切看起来都设置正确,但当从swagger portal和postman发送请求borth时,api似乎混淆了或完全无法正确路由请求,如下图中显示“v1”请求的最后一个片段所示,尝试输入“v2”操作失败导致“404未找到”:
有人知道如何正确设置吗
关于我使用的更多信息如下:
- .Net核心2.1
- Swashback.AspNetCore.Swagger(4.0.1)
- Swashback.AspNetCore.Annotations(4.0.1)
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);
});
});