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”:

enter image description here

有人知道如何正确设置吗?

有关我使用的更多信息是:

  • .Net Core 2.1
  • Swashbuckle.AspNetCore.Swagger(4.0.1)
  • Swashbuckle.AspNetCore.Annotations(4.0.1)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)