Я использую Scalar и поэтому применяю ряд преобразований к своим документам, в основном для изменения пути при развертывании нашего приложения в Kubernetes под поддоменом, а также для добавления поддержки аутентификации носителя.
В моем Program.cs я определил следующее, где akspath — это просто строковая переменная, полученная из конфигурации:
Код: Выделить всё
builder.Services.AddOpenApi("my-api", options =>
{
options.AddDocumentTransformer();
if (!string.IsNullOrWhiteSpace(aksPath) && !builder.Environment.IsDevelopment())
{
options.AddDocumentTransformer();
}
});
Код: Выделить всё
BearerSecuritySchemeTransformerКод: Выделить всё
public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
{
var authenticationSchemes = await _authenticationSchemeProvider.GetAllSchemesAsync();
if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer"))
{
var requirements = new Dictionary
{
["Bearer"] = new OpenApiSecurityScheme
{
Type = SecuritySchemeType.Http,
Scheme = "bearer",
In = ParameterLocation.Header,
BearerFormat = "JWT"
}
};
document.Components ??= new OpenApiComponents();
document.Components.SecuritySchemes = requirements;
foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations))
{
operation.Value.Security.Add(new OpenApiSecurityRequirement
{
[new OpenApiSecurityScheme { Reference = new OpenApiReference { Id = "Bearer", Type = ReferenceType.SecurityScheme } }] = Array.Empty()
});
}
}
}
Код: Выделить всё
public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context,
CancellationToken cancellationToken)
{
var path = string.Empty;
if (!string.IsNullOrWhiteSpace(_urlPrefix))
{
path = $"/{_urlPrefix}";
}
document.Servers = new List
{
new() { Url = path }
};
}
Однако в момент обновления до версии 10.0.0 я сталкиваюсь с множеством ошибок с схемы OpenApiSecurity полностью меняют структуру.
Здесь я нашел ссылку о том, как изменить мои определения для соответствия .NET 10 https://learn.microsoft.com/en-us/aspne ... tcore-10.0
, где они предлагают сделать следующее:
Код: Выделить всё
internal sealed class BearerSecuritySchemeTransformer(IAuthenticationSchemeProvider authenticationSchemeProvider) : IOpenApiDocumentTransformer
{
public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
{
var authenticationSchemes = await authenticationSchemeProvider.GetAllSchemesAsync();
if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer"))
{
// Add the security scheme at the document level
var securitySchemes = new Dictionary
{
["Bearer"] = new OpenApiSecurityScheme
{
Type = SecuritySchemeType.Http,
Scheme = "bearer", // "bearer" refers to the header name here
In = ParameterLocation.Header,
BearerFormat = "Json Web Token"
}
};
document.Components ??= new OpenApiComponents();
document.Components.SecuritySchemes = securitySchemes;
// Apply it as a requirement for all operations
foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations))
{
operation.Value.Security ??= [];
operation.Value.Security.Add(new OpenApiSecurityRequirement
{
[new OpenApiSecuritySchemeReference("Bearer", document)] = []
});
}
}
}
}
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.
at Microsoft.AspNetCore.OpenApi.Generated.F821B935A564B6EA7D37ADF4B1A672CA2DD9CE6F88563F940522F766DFE640041__XmlCommentOperationTransformer.TransformAsync(операция OpenApiOperation, Контекст OpenApiOperationTransformerContext, CancellationToken cancelToken) в /Users/jason/Src/myAPI/myAPI/obj/Debug/net10.0/Microsoft.AspNetCore.OpenApi.SourceGenerators/Microsoft.AspNetCore.OpenApi.SourceGenerators.XmlCommentGenerator/OpenApiXmlCommentSupport.generated.cs:line 858
Учитывая, что эти ошибки происходят из-за внутреннего создания исходного кода в .NET, который я сам явно не использую, и того факта, что я использую предоставленный ими фрагмент, я чувствую, что это либо ошибка, либо я что-то упускаю.
Были ли у кого-нибудь подобные проблемы и удалось ли их обойти?>
Подробнее здесь: https://stackoverflow.com/questions/798 ... -transform
Мобильная версия