У меня есть несколько проектов веб-API (микросервисов), и я хочу предоставить их доступ, используя только одну ссылку swagger-уи. Ради этого поста я буду называть каждый проект веб-API Конечная точкаA и Конечная точкаB.
Я создал проект swagger-уи и добавил в этот проект каждую конечную точку.
Мой проект swagger-уи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");
});
}
Мои конечные точки A/B Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "EndpointA", // or "EndpointB",
});
});
}
Моя проблема в том, что каждый из файлов swagger.json не содержит префикс конечной точки. Вместо того, чтобы быть /EndpointA/Controller/Action, пути являются /Controller/Action, которые недействительны.
Я попытался установить пользовательский префикс URL-адреса в своем проекте пользовательского интерфейса swagger, как этот c.RoutePrefix = "EndpointA";. Это работает для моего Конечная точкаA, но я могу установить только один для всех конечных точек, поэтому Конечная точкаB не будет работать.
Я также пытался установить префикс непосредственно в каждой конечной точке, используя SwaggerGen, но я не знаю, как/возможно ли это.
@ mclark1129 Конечно, это сработает, но мой вопрос: могу ли я иметь только один swagger-ui для всех своих проектов?
Взгляните сюда: swagger-net-test-multiapiversions.azurewebsites.net/swagger/ui/… ... В правом верхнем углу есть раскрывающийся список для выбора спецификации чванства. Это то, что вы хотите сделать?
@HelderSepulveda Да, вот так, но с разными конечными точками вместо версии.





В итоге я использовал UsePathBaseExtensions.UsePathBase(IApplicationBuilder, PathString) Метод для регистрации базового пути к моему API.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UsePathBase(new PathString("/EndpointA"));
app.UseMvc();
}
Альтернативным решением было бы использовать фильтр документа базового пути swagger следующим образом:
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.DocumentFilter<BasePathFilter>();
});
}
И фильтр:
public class BasePathFilter: IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.BasePath = "/EndpointA";
}
}
Если у вас есть два проекта веб-API, то, вероятно, вы настраиваете (или могли бы настроить) два
IApplicationBuilders. Вы пытались явно настроить swagger для каждого проекта? Другими словами, просто создайте отдельный пользовательский интерфейс Swagger для каждого API.