Jus*_*ard 5 c# swagger swagger-ui swashbuckle asp.net-core
我有多个 web api 项目(微服务),我想只使用一个swagger-ui链接来公开它们。为了这篇文章,我将每个 web api 项目称为EndpointA和EndpointB。
我创建了一个swagger-ui项目,并将每个端点添加到这个项目中。
我的swagger-ui项目Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSwaggerUI(c => {
c.SwaggerEndpoint("/EndpointA/swagger/v1/swagger.json", "EndpointA");
c.SwaggerEndpoint("/EndpointB/swagger/v1/swagger.json", "EndpointB");
});
}
Run Code Online (Sandbox Code Playgroud)
我的端点 A/B Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "EndpointA", // or "EndpointB",
});
});
}
Run Code Online (Sandbox Code Playgroud)
我的问题是每个swagger.json文件都不包含端点前缀。而不是/EndpointA/Controller/Action,路径是/Controller/Action,这是无效的。
我试图在我的 swagger ui 项目中设置自定义 url 前缀,如下所示c.RoutePrefix = "EndpointA";。它适用于我的EndpointA,但我只能为所有端点设置一个,因此EndpointB不起作用。
我还尝试使用 直接在每个端点中设置前缀SwaggerGen,但我不知道如何/是否可能。
我最终使用该UsePathBaseExtensions.UsePathBase(IApplicationBuilder, PathString)方法将基本路径注册到我的 api。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UsePathBase(new PathString("/EndpointA"));
app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是使用 swagger 基本路径文档过滤器,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.DocumentFilter<BasePathFilter>();
});
}
Run Code Online (Sandbox Code Playgroud)
和过滤器:
public class BasePathFilter: IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.BasePath = "/EndpointA";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3225 次 |
| 最近记录: |