C# 如何在REDOC中设置不同API版本的下拉列表#
这是我在startup.cs中的配置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
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";
}
});
}