У меня есть файл запуска, в котором я настраиваю пользовательский интерфейс Swagger и URL-адрес конечных точек
namespace AccountingService
{
public class Startup
{
//public Startup(IConfiguration configuration, IHostEnvironment env, ILogger logger) { }
//public void ConfigureServices(IServiceCollection services){ }
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IApiVersionDescriptionProvider provider)
{
if (HostEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIpRateLimiting();
app.ConfigureCustomMiddleware(_appSettings);
UserHelper.InitDependencies(serviceProvider.GetRequiredService());
app.UseRouting();
app.UseCors("MyPolicy");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseTimezone();
app.UseErrorService(serviceProvider);
app.UseSession();
app.UseUserService();
if (_appSettings.Swagger.Enabled)
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"swagger/{description.GroupName}/swagger.json", description.GroupName.ToLowerInvariant());
options.RoutePrefix = string.Empty;
}
});
}
//app.UseNamedSwagger(_appSettings.ServiceName, _appSettings.ServiceTitle, _appSettings.Version);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Вот как это работает в общем URL-адресе swagger в этом случае
localhost:[port]/swagger/{groupname}/swagger.json
Мне нужно изменить URL-адрес swagger, например, на [name-service]/swagger/v1/swagger.json
Необходимо исправить маршрутизацию на nginx, нашем сервере в докере compose
Когда я пытаюсь изменить SwaggerEndpoint любое другое значение URL-адреса, например
_appSettings.ServiceName
if (_appSettings.Swagger.Enabled)
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"{_appSettings.ServiceName}/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
options.RoutePrefix = string.Empty;
}
});
}
Он вообще не работает и не имеет к этому никакого отношения.
Та же проблема, когда я пытаюсь изменить только префикс маршрута
результат
app.RoutePrefix = $"{_appSettings.ServiceName}/swagger";
Я не знаю, как правильно сформировать вопрос и проблемный случай в этом случае.
Но когда я использую другой метод UseNamedSwagger для создания пользовательского интерфейса Swagger
app.UseNamedSwagger(_appSettings.ServiceName, _appSettings.ServiceTitle, _appSettings.Version);
вместо
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"{_appSettings.ServiceName}/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
options.RoutePrefix = string.Empty;
}
});
Он работает правильно и URL-адрес Swagger меняется правильно, но здесь мои версии исчезают v1,v2
но здесь мои версии исчезают v1,v2
Здесь добавлено, как я создаю контроллер API
[Authorize]
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ActsController : ControllerBase
Что мне нужно изменить или добавить, чтобы правильно показать URL-адрес swagger "edo-service/swagger/v1/swagger" и не потерять определения версий (v1,v2)
ConfigureServices, если необходимо
public void ConfigureServices(IServiceCollection services)
{
_logger.LogTrace("Startup::ConfigureServices");
//Enable Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// configure strongly typed settings objects
_appSettings = Configuration.GetSection("AppSettings").Get();
services.Configure(Configuration.GetSection(nameof(AppSettings)));
// configure jwt authentication
var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
// configure swagger settings
var swaggerSettings = Configuration.GetSection("SwaggerAdminSettings").Get();
services.Configure(
Configuration.GetSection(nameof(ErrorServiceApiConfiguration)));
services.AddAuthentication(..);
// requires using Microsoft.Extensions.Options
services.Configure(o =>
{
o.ValueLengthLimit = int.MaxValue;
o.MultipartBodyLengthLimit = int.MaxValue;
o.MemoryBufferThreshold = int.MaxValue;
});
//Add IMapper profile configuration to DI
var mapperConfig = new MapperConfiguration(mc => mc.AddProfile(new AutoMapperProfile()));
services.AddSingleton(mapperConfig.CreateMapper());
// many other services....
// -- API Rate Limit Configuration --
services.AddMemoryCache();
services.AddInMemoryRateLimiting();
services.AddSingleton();
services.Configure(Configuration.GetSection("IpRateLimiting"));
//Add Services here
//==== CommonServiceTools services ====
services.AddLogger();
services.ConfigureCrud();
services.AddExternalApi();
services.AddWarehouseApi();
services.AddInvoiceManager();
// many other services....
services.AddDistributedMemoryCache();
services.AddSession();
services.Configure(Configuration.GetSection(nameof(MinioSettings)));
services.Configure(Configuration.GetSection(nameof(WarehouseApiSettings)));
services.AddControllers(opt =>
{ opt.UseCentralRoutePrefix(new RouteAttribute(_appSettings.ServiceName)); })
.AddNewtonsoftJson(options => options.UseMemberCasing())
.AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())).SetCompatibilityVersion(CompatibilityVersion.Latest);
//API versioning
services.AddApiVersioning(
o =>
{
//o.Conventions.Controller().HasApiVersion(1, 0);
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
o.ApiVersionReader = new UrlSegmentApiVersionReader();
}
);
// note: the specified format code will format the version as "'v'major[.minor][-status]"
services.AddVersionedApiExplorer(
options =>
{
options.GroupNameFormat = "'v'VVV";
// note: this option is only necessary when versioning by url segment. the SubstitutionFormat
// can also be used to control the format of the API version in route accounting-service
options.SubstituteApiVersionInUrl = true;
});
services.AddWkhtmltopdf();
if (_appSettings.Swagger.Enabled)
{
// -- Swagger configuration --
services.AddTransient();
// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c =>
{
c.OperationFilter();
c.UseAllOfToExtendReferenceSchemas();
//c.SwaggerDoc(_appSettings.Version,
// new OpenApiInfo { Title = _appSettings.ServiceTitle, Version = _appSettings.Version });
/*Authorization*/
var jwtSecurityScheme = new OpenApiSecurityScheme
{
Scheme = "bearer",
BearerFormat = "JWT",
Name = "JWT Authentication",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Description = "Put **_ONLY_** your JWT Bearer token on textbox below!",
Reference = new OpenApiReference
{
Id = JwtBearerDefaults.AuthenticationScheme,
Type = ReferenceType.SecurityScheme
}
};
c.AddSecurityDefinition(jwtSecurityScheme.Reference.Id, jwtSecurityScheme);
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{ jwtSecurityScheme, Array.Empty() }
});
//1-Get all the assemblies of the project to add the related XML Comments
Assembly currentAssembly = Assembly.GetExecutingAssembly();
AssemblyName[] referencedAssemblies = currentAssembly.GetReferencedAssemblies();
IEnumerable allAssemblies = null;
if (referencedAssemblies != null && referencedAssemblies.Any())
allAssemblies = referencedAssemblies.Union(new AssemblyName[] { currentAssembly.GetName() });
else
allAssemblies = new AssemblyName[] { currentAssembly.GetName() };
IEnumerable xmlDocs = allAssemblies
.Select(a => Path.Combine(Path.GetDirectoryName(currentAssembly.Location), $"{a.Name}.xml"))
.Where(f => File.Exists(f));
//2-Add the path to the XML comments for the assemblies having enabled the doc generation
if (xmlDocs != null && xmlDocs.Any())
{
foreach (var item in xmlDocs)
{
c.IncludeXmlComments(item, includeControllerXmlComments: true);
}
}
});
}
services.AddSingleton();
_logger.LogDebug("Startup::Constructor::Settings loaded");
}
Подробнее здесь: https://stackoverflow.com/questions/748 ... ersionning
Как изменить URL-адрес конечной точки маршрута Swagger и сохранить управление версиями API ⇐ C#
Место общения программистов C#
1769638858
Anonymous
У меня есть файл запуска, в котором я настраиваю пользовательский интерфейс Swagger и URL-адрес конечных точек
namespace AccountingService
{
public class Startup
{
//public Startup(IConfiguration configuration, IHostEnvironment env, ILogger logger) { }
//public void ConfigureServices(IServiceCollection services){ }
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IApiVersionDescriptionProvider provider)
{
if (HostEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIpRateLimiting();
app.ConfigureCustomMiddleware(_appSettings);
UserHelper.InitDependencies(serviceProvider.GetRequiredService());
app.UseRouting();
app.UseCors("MyPolicy");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseTimezone();
app.UseErrorService(serviceProvider);
app.UseSession();
app.UseUserService();
if (_appSettings.Swagger.Enabled)
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"swagger/{description.GroupName}/swagger.json", description.GroupName.ToLowerInvariant());
options.RoutePrefix = string.Empty;
}
});
}
//app.UseNamedSwagger(_appSettings.ServiceName, _appSettings.ServiceTitle, _appSettings.Version);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Вот как это работает в общем URL-адресе swagger в этом случае
localhost:[port]/swagger/{groupname}/swagger.json
Мне нужно изменить URL-адрес swagger, например, на [b][name-service][/b]/swagger/v1/swagger.json
Необходимо исправить маршрутизацию на nginx, нашем сервере в докере compose
Когда я пытаюсь изменить SwaggerEndpoint любое другое значение URL-адреса, например
_appSettings.ServiceName
if (_appSettings.Swagger.Enabled)
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"{_appSettings.ServiceName}/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
options.RoutePrefix = string.Empty;
}
});
}
Он вообще не работает и не имеет к этому никакого отношения.
Та же проблема, когда я пытаюсь изменить [b]только[/b] префикс маршрута
результат
app.RoutePrefix = $"{_appSettings.ServiceName}/swagger";
Я не знаю, как правильно сформировать вопрос и проблемный случай в этом случае.
Но когда я использую другой метод [b]UseNamedSwagger[/b] для создания пользовательского интерфейса Swagger
app.UseNamedSwagger(_appSettings.ServiceName, _appSettings.ServiceTitle, _appSettings.Version);
вместо
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"{_appSettings.ServiceName}/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
options.RoutePrefix = string.Empty;
}
});
Он работает правильно и URL-адрес Swagger меняется правильно, но здесь мои версии исчезают v1,v2
но здесь мои версии исчезают v1,v2
Здесь добавлено, как я создаю контроллер API
[Authorize]
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ActsController : ControllerBase
[b]Что мне нужно изменить или добавить, чтобы правильно показать[/b] URL-адрес swagger "edo-service/swagger/v1/swagger" и не потерять определения версий (v1,v2)
[b]ConfigureServices[/b], если необходимо
public void ConfigureServices(IServiceCollection services)
{
_logger.LogTrace("Startup::ConfigureServices");
//Enable Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// configure strongly typed settings objects
_appSettings = Configuration.GetSection("AppSettings").Get();
services.Configure(Configuration.GetSection(nameof(AppSettings)));
// configure jwt authentication
var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
// configure swagger settings
var swaggerSettings = Configuration.GetSection("SwaggerAdminSettings").Get();
services.Configure(
Configuration.GetSection(nameof(ErrorServiceApiConfiguration)));
services.AddAuthentication(..);
// requires using Microsoft.Extensions.Options
services.Configure(o =>
{
o.ValueLengthLimit = int.MaxValue;
o.MultipartBodyLengthLimit = int.MaxValue;
o.MemoryBufferThreshold = int.MaxValue;
});
//Add IMapper profile configuration to DI
var mapperConfig = new MapperConfiguration(mc => mc.AddProfile(new AutoMapperProfile()));
services.AddSingleton(mapperConfig.CreateMapper());
// many other services....
// -- API Rate Limit Configuration --
services.AddMemoryCache();
services.AddInMemoryRateLimiting();
services.AddSingleton();
services.Configure(Configuration.GetSection("IpRateLimiting"));
//Add Services here
//==== CommonServiceTools services ====
services.AddLogger();
services.ConfigureCrud();
services.AddExternalApi();
services.AddWarehouseApi();
services.AddInvoiceManager();
// many other services....
services.AddDistributedMemoryCache();
services.AddSession();
services.Configure(Configuration.GetSection(nameof(MinioSettings)));
services.Configure(Configuration.GetSection(nameof(WarehouseApiSettings)));
services.AddControllers(opt =>
{ opt.UseCentralRoutePrefix(new RouteAttribute(_appSettings.ServiceName)); })
.AddNewtonsoftJson(options => options.UseMemberCasing())
.AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())).SetCompatibilityVersion(CompatibilityVersion.Latest);
//API versioning
services.AddApiVersioning(
o =>
{
//o.Conventions.Controller().HasApiVersion(1, 0);
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
o.ApiVersionReader = new UrlSegmentApiVersionReader();
}
);
// note: the specified format code will format the version as "'v'major[.minor][-status]"
services.AddVersionedApiExplorer(
options =>
{
options.GroupNameFormat = "'v'VVV";
// note: this option is only necessary when versioning by url segment. the SubstitutionFormat
// can also be used to control the format of the API version in route accounting-service
options.SubstituteApiVersionInUrl = true;
});
services.AddWkhtmltopdf();
if (_appSettings.Swagger.Enabled)
{
// -- Swagger configuration --
services.AddTransient();
// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c =>
{
c.OperationFilter();
c.UseAllOfToExtendReferenceSchemas();
//c.SwaggerDoc(_appSettings.Version,
// new OpenApiInfo { Title = _appSettings.ServiceTitle, Version = _appSettings.Version });
/*Authorization*/
var jwtSecurityScheme = new OpenApiSecurityScheme
{
Scheme = "bearer",
BearerFormat = "JWT",
Name = "JWT Authentication",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Description = "Put **_ONLY_** your JWT Bearer token on textbox below!",
Reference = new OpenApiReference
{
Id = JwtBearerDefaults.AuthenticationScheme,
Type = ReferenceType.SecurityScheme
}
};
c.AddSecurityDefinition(jwtSecurityScheme.Reference.Id, jwtSecurityScheme);
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{ jwtSecurityScheme, Array.Empty() }
});
//1-Get all the assemblies of the project to add the related XML Comments
Assembly currentAssembly = Assembly.GetExecutingAssembly();
AssemblyName[] referencedAssemblies = currentAssembly.GetReferencedAssemblies();
IEnumerable allAssemblies = null;
if (referencedAssemblies != null && referencedAssemblies.Any())
allAssemblies = referencedAssemblies.Union(new AssemblyName[] { currentAssembly.GetName() });
else
allAssemblies = new AssemblyName[] { currentAssembly.GetName() };
IEnumerable xmlDocs = allAssemblies
.Select(a => Path.Combine(Path.GetDirectoryName(currentAssembly.Location), $"{a.Name}.xml"))
.Where(f => File.Exists(f));
//2-Add the path to the XML comments for the assemblies having enabled the doc generation
if (xmlDocs != null && xmlDocs.Any())
{
foreach (var item in xmlDocs)
{
c.IncludeXmlComments(item, includeControllerXmlComments: true);
}
}
});
}
services.AddSingleton();
_logger.LogDebug("Startup::Constructor::Settings loaded");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/74849728/how-change-swagger-route-endpoint-url-and-save-api-versionning[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия