Как изменить URL-адрес конечной точки маршрута Swagger и сохранить управление версиями APIC#

Место общения программистов C#
Ответить
Anonymous
 Как изменить URL-адрес конечной точки маршрута Swagger и сохранить управление версиями API

Сообщение 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, например, на [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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»