Обновление проекта до .NET 10 нарушает поддержку скаляров при использовании преобразователей документов.C#

Место общения программистов C#
Ответить
Anonymous
 Обновление проекта до .NET 10 нарушает поддержку скаляров при использовании преобразователей документов.

Сообщение Anonymous »

В настоящее время я нахожусь в процессе обновления до .NET 10 с .NET 9, но, к сожалению, как обычно, документация по критическим изменениям, похоже, отсутствует, когда дело касается определенных функций и возможностей.
Я использую 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()
});
}
}
}
И UrlPrefixTransformer:

Код: Выделить всё

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 }
};
}
Если я обновлю все пакеты Nuget в своем решении до версий .NET 10 и оставлю Microsoft.AspNetCore.OpenApi в версии 9.0.11, то все будет работать как ожидалось, и я смогу видеть свои документы определения скалярного API без ошибок во время выполнения.
Однако в момент обновления до версии 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)] = []
});
}
}
}
}
Если я воспользуюсь этой рекомендацией, мое решение компилируется и запускается, однако, если я нажимаю на свои скалярные документы, я вижу, что пустое определение с документом «my-api» не может быть загружено, и если я проверяю журналы отладки, регистрируются следующие проблемы:

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
Ответить

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

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

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

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

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