C# 如何在REDOC中设置不同API版本的下拉列表#

C# 如何在REDOC中设置不同API版本的下拉列表#,c#,asp.net,asp.net-core,swagger,redoc,C#,Asp.net,Asp.net Core,Swagger,Redoc,这是我在startup.cs中的配置 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 0); options.AssumeDefaultVersionWhenUnspecified = true; options.ApiVersionReader = new UrlS

这是我在startup.cs中的配置

        services.AddApiVersioning(options =>
        {
            options.DefaultApiVersion = new ApiVersion(1, 0);
            options.AssumeDefaultVersionWhenUnspecified = true;
            options.ApiVersionReader = new UrlSegmentApiVersionReader();
            options.ReportApiVersions = true;
        });


        // Register the Swagger services
        services.AddSwaggerDocument(config =>
        {
            config.DocumentName = "v1";
            config.ApiGroupNames = new[] { "1" };
            config.GenerateEnumMappingDescription = true;
            config.AddSecurity("bearer", Enumerable.Empty<string>(), new OpenApiSecurityScheme
            {
                Type = OpenApiSecuritySchemeType.OAuth2,
                Description = "Get access to data while protecting your account credentials. OAuth2 is also a safer and more secure way to give you access.",
                Flow = OpenApiOAuth2Flow.Implicit,
                Flows = new OpenApiOAuthFlows()
                {
                    Implicit = new OpenApiOAuthFlow()
                    {

                        Scopes = new Dictionary<string, string>
                        {
                            {Configuration.GetValue<string>("IdentityServer:ClientId"), Configuration.GetValue<string>("IdentityServer:ClientId")},
                            {Configuration.GetValue<string>("IdentityServer:BankClientId"), Configuration.GetValue<string>("IdentityServer:BankClientId")}

                        },
                        TokenUrl = Configuration.GetValue<string>("IdentityServer:Authority") + "/connect/token",
                        AuthorizationUrl = Configuration.GetValue<string>("IdentityServer:Authority") + "/connect/authorize",

                    },
                }
            });
            config.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("bearer"));
            config.PostProcess = document =>
            {
                document.Info.Version = Configuration.GetValue<String>("SwaggerDocument:Version");
                document.Info.Title = Configuration.GetValue<String>("SwaggerDocument:Title");
                document.Info.Description = Configuration.GetValue<String>("SwaggerDocument:Description");
            };
        })
        .AddSwaggerDocument(document =>
            {
                document.DocumentName = "v2";
                document.ApiGroupNames = new[] { "2" };
                document.GenerateEnumMappingDescription = true;
                document.AddSecurity("bearer", Enumerable.Empty<string>(), new OpenApiSecurityScheme
                {
                    Type = OpenApiSecuritySchemeType.OAuth2,
                    Description = "Get access to data while protecting your account credentials. OAuth2 is also a safer and more secure way to give you access.",
                    Flow = OpenApiOAuth2Flow.Implicit,
                    Flows = new OpenApiOAuthFlows()
                    {
                        Implicit = new OpenApiOAuthFlow()
                        {

                            Scopes = new Dictionary<string, string>
                        {
                            {Configuration.GetValue<string>("IdentityServer:ClientId"), Configuration.GetValue<string>("IdentityServer:ClientId")},
                            {Configuration.GetValue<string>("IdentityServer:BankClientId"), Configuration.GetValue<string>("IdentityServer:BankClientId")}

                        },
                            TokenUrl = Configuration.GetValue<string>("IdentityServer:Authority") + "/connect/token",
                            AuthorizationUrl = Configuration.GetValue<string>("IdentityServer:Authority") + "/connect/authorize",

                        },
                    }
                });
                document.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("bearer"));
                document.PostProcess = document =>
                {
                    document.Info.Version = "v2";
                    document.Info.Title = Configuration.GetValue<String>("SwaggerDocument:Title");
                    document.Info.Description = Configuration.GetValue<String>("SwaggerDocument:Description");
                };
            });

        app.UseOpenApi();
        
        //Redoc
        app.UseReDoc(options =>
        {
            options.Path = Configuration.GetValue<String>("Redoc:Path");
            options.DocumentPath = Configuration.GetValue<String>("Redoc:DocumentPath");
        });
services.addaVersioning(选项=>
{
options.DefaultApiVersion=新的ApiVersion(1,0);
options.AssumeDefaultVersionWhenUnspecified=true;
options.ApiVersionReader=new urlsectionapiversionreader();
options.ReportApiVersions=true;
});
//注册招摇过市服务
services.AddSwaggerDocument(配置=>
{
config.DocumentName=“v1”;
config.ApiGroupNames=new[]{“1”};
config.generateenumappingdescription=true;
config.AddSecurity(“bearer”,Enumerable.Empty(),新OpenApiSecurityScheme
{
Type=OpenApiSecuritySchemeType.OAuth2,
Description=“在保护您的帐户凭据的同时访问数据。OAuth2也是一种更安全的访问方式。”,
Flow=openapiouth2flow.Implicit,
Flows=新的openapiouthflows()
{
隐式=新的openapiouthflow()
{
范围=新字典
{
{Configuration.GetValue(“IdentityServer:ClientId”)、Configuration.GetValue(“IdentityServer:ClientId”)},
{Configuration.GetValue(“IdentityServer:BankClientId”)、Configuration.GetValue(“IdentityServer:BankClientId”)}
},
TokenUrl=Configuration.GetValue(“IdentityServer:Authority”)+“/connect/token”,
AuthorizationUrl=Configuration.GetValue(“IdentityServer:Authority”)+“/connect/authorize”,
},
}
});
config.OperationProcessors.Add(新的AspNetCoreOperationSecurityScopeProcessor(“承载”);
config.PostProcess=文档=>
{
document.Info.Version=Configuration.GetValue(“SwaggerDocument:Version”);
document.Info.Title=Configuration.GetValue(“SwaggerDocument:Title”);
document.Info.Description=Configuration.GetValue(“SwaggerDocument:Description”);
};
})
.AddSwagger文档(文档=>
{
document.DocumentName=“v2”;
document.ApiGroupNames=new[]{“2”};
document.generateenumappingdescription=true;
document.AddSecurity(“bearer”,Enumerable.Empty(),新OpenApiSecurityScheme
{
Type=OpenApiSecuritySchemeType.OAuth2,
Description=“在保护您的帐户凭据的同时访问数据。OAuth2也是一种更安全的访问方式。”,
Flow=openapiouth2flow.Implicit,
Flows=新的openapiouthflows()
{
隐式=新的openapiouthflow()
{
范围=新字典
{
{Configuration.GetValue(“IdentityServer:ClientId”)、Configuration.GetValue(“IdentityServer:ClientId”)},
{Configuration.GetValue(“IdentityServer:BankClientId”)、Configuration.GetValue(“IdentityServer:BankClientId”)}
},
TokenUrl=Configuration.GetValue(“IdentityServer:Authority”)+“/connect/token”,
AuthorizationUrl=Configuration.GetValue(“IdentityServer:Authority”)+“/connect/authorize”,
},
}
});
document.OperationProcessors.Add(新的AspNetCoreOperationSecurityScopeProcessor(“持票人”);
document.PostProcess=文档=>
{
document.Info.Version=“v2”;
document.Info.Title=Configuration.GetValue(“SwaggerDocument:Title”);
document.Info.Description=Configuration.GetValue(“SwaggerDocument:Description”);
};
});
app.UseOpenApi();
//雷多克
app.UseReDoc(选项=>
{
options.Path=Configuration.GetValue(“Redoc:Path”);
options.DocumentPath=Configuration.GetValue(“Redoc:DocumentPath”);
});
API版本显示为招摇过市。下面是图片

但雷多克没有发生同样的事情。下面是图片

如果我将url从https://localhost:44311/redoc/index.html?url=/swagger/v1/swagger.json 到https://localhost:44311/redoc/index.html?url=/swagger/v2/swagger.json
只需将v1更改为v2,然后我就可以得到v2的API。但是我希望REDOC用户界面应该有一个下拉菜单来选择版本。有人能帮我吗?

你不能有一个UI选择器,但是你可以为不同的版本更改URL上的行为。这意味着每个版本可以有不同的URL。在进行配置时,最简单的方法是如下定义URL

请注意,我将假设您了解版本控制,以便使其正常工作,并且所有的工作都是使用Swagger版本控制。因此,我在Configure()方法上获得了一个IApiVersionDescriptionProvider参数。然后,它允许我迭代不同的版本并创建不同的ReDoc


版本选择器是一个只支持用户界面的功能。
public void Configure(IApplicationBuilder app, IApiVersionDescriptionProvider provider){
 
 app.UseSwagger();

 // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
 // specifying the Swagger JSON endpoint.
 app.UseSwaggerUI(c =>
 {
     foreach (var description in provider.ApiVersionDescriptions)
      {
                c.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",
                    $"Your API {description.GroupName.ToUpperInvariant()}");
      }
      c.OAuthUsePkce();
      c.OAuthClientId("something");
      c.OAuthAppName("Something");
 });

 //Use ReDoc
 app.UseReDoc(c =>
 {
   foreach (var description in provider.ApiVersionDescriptions)
    {
      c.DocumentTitle = $"MY API Documentation {description.GroupName.ToUpperInvariant()}";
      c.RoutePrefix = $"{documentation/{description.GroupName}";
      c.SpecUrl = $"{/swagger/{description.GroupName}/swagger.json";
    }
 });
}