#c# #asp.net-core #nswag
#c# #asp.net-core #nswag
Вопрос:
Мне нужно добавить пользовательские заголовки, но я не могу понять это. Я пытаюсь использовать новые сервисы.AddOpenApiDocument() вместо служб.AddSwaggerDocument() . Я хочу добавить эти пользовательские заголовки во весь мой API, а не только в один метод или контроллер. Я попытался добавить операционный процессор, но при загрузке пользовательского интерфейса swagger я получаю следующую ошибку «😱 Не удалось отобразить этот компонент, см. Консоль».
Вот мой фрагмент в моем ConfigureServices()
:
services.AddOpenApiDocument(document =>
{
...
// this works fine
document.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer"));
document.DocumentProcessors.Add(new SecurityDefinitionAppender("Bearer", new SwaggerSecurityScheme
{
Type = SwaggerSecuritySchemeType.ApiKey,
Name = "Authorization",
In = SwaggerSecurityApiKeyLocation.Header
})
);
// this is the header i want to show up for all endpoints that is breaking
document.OperationProcessors.Add(new SampleHeaderOperationProcessor());
});
Вот мой операционный процессор:
public class SampleHeaderOperationProcessor : IOperationProcessor
{
public Task<bool> ProcessAsync(OperationProcessorContext context)
{
context.OperationDescription.Operation.Parameters.Add(
new SwaggerParameter {
Name = "Sample",
Kind = SwaggerParameterKind.Header,
Type = NJsonSchema.JsonObjectType.String,
IsRequired = false,
Description = "This is a test header",
Default = "{{"field1": "value1", "field2": "value2"}}"
});
return Task.FromResult(true);
}
}
Единственное, что у меня есть по этому поводу в моей Configure ():
app.UseSwagger();
app.UseSwaggerUi3();
Вот моя ошибка и журнал консоли:
Моя ошибка и журнал консоли
Если это поможет, я использую ASP .NET CORE 2.2
и NSwag.AspNetCore v12.1.0
Ответ №1:
Вот пример, который я реализовал в проекте. Для меня здесь все работает нормально:
Реализация интерфейса «IOperationProcessor»:
using NSwag;
using NSwag.SwaggerGeneration.Processors;
using NSwag.SwaggerGeneration.Processors.Contexts;
using System.Threading.Tasks;
namespace api.mstiDFE._Helpers.Swagger
{
public class AddRequiredHeaderParameter : IOperationProcessor
{
public Task<bool> ProcessAsync(OperationProcessorContext context)
{
context.OperationDescription.Operation.Parameters.Add(
new SwaggerParameter
{
Name = "token",
Kind = SwaggerParameterKind.Header,
Type = NJsonSchema.JsonObjectType.String,
IsRequired = false,
Description = "Chave de acesso à API, fornecida pela RevendaCliente",
Default = "Default Value"
});
return Task.FromResult(true);
}
}
}
Ссылка в startup.cs:
internal static void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
// Register the Swagger services
services.AddSwaggerDocument(config =>
{
// Adds the "token" parameter in the request header, to authorize access to the APIs
config.OperationProcessors.Add(new AddRequiredHeaderParameter());
config.PostProcess = document =>
{
document.Info.Version = "v1";
document.Info.Title = "Title ";
document.Info.Description = "API para geração de Documentos Fiscais Eletrônicos (DF-e) do projeto SPED";
document.Info.TermsOfService = "None";
document.Info.Contact = new NSwag.SwaggerContact
{
Name = "Name",
Email = "Email ",
Url = "Url "
};
document.Info.License = new NSwag.SwaggerLicense
{
Name = "Use under LICX",
Url = "https://example.com/license"
};
};
});
}
Комментарии:
1. Разница, которую я вижу между вашим кодом и моим, заключается в том, что вы используете сервисы. AddSwaggerDocument(), который генерирует документацию в Swagger версии 2.0 (который работает в вашем коде), но я пытаюсь использовать новые сервисы. AddOpenApiDocument для создания OAS v3.0, который для меня ломается.
2. Загрузите полное решение для тестирования здесь: github.com/silvairsoares/.NET_Core Но я провел здесь тест, поменяв местами «сервисы. Добавляет swaggerdocument»с «службами. AddOpenApiDocument» и в пользовательском интерфейсе Swager появилось следующее сообщение: «Не удалось отобразить этот компонент, см. консоль». По-видимому, существует проблема со «службами. Инструкция AddOpenApiDocument». Есть ли какая-либо особая причина для использования NSwag? В противном случае вы могли бы попробовать использовать «Swashbuckle»
3. Если вам нужно, у меня есть полный пример реализации Swagger с помощью «Swashbuckle». Где я также включил пользовательский параметр в заголовок. Для того, что я исследовал здесь: github.com/domaindrivendev/Swashbuckle . В качестве сетевого ядра есть поддержка OpenAPI 3.0.
4. Привет, Сильвир, спасибо за ответ. В итоге я опубликовал решение своей проблемы, которое дал мне Рико Сутер. Я создал проблему для проекта пользовательского интерфейса Swagger в надежде, что они смогут устранить не описательную ошибку: проблема 5366 . Кроме того, на момент написания этой статьи я полагаю, что Swashbuckle все еще находится в предварительной версии для их спецификации open API, поэтому я использую NSwag.
Ответ №2:
Это, наконец, сработало для меня. Решение напрямую от Рико Сутера,
Попробуйте
Schema = new JsonSchema4 { Type = NJsonSchema.JsonObjectType.String }
вместо
Type = NJsonSchema.JsonObjectType.String
(Я думаю, что тип устарел в OpenAPI 3)
Ответ №3:
Большое спасибо оригинальным ответам в этой теме.
Мне пришлось сделать несколько небольших обновлений для приведенных выше ответов из-за обновлений NSwag.
Приведенное ниже работает для меня в версиях (NSwag.Core: 13.1.2, NJsonSchema: 10.0.24):
context.OperationDescription.Operation.Parameters.Add(
new OpenApiParameter
{
Name = "HEADER_NAME",
Kind = OpenApiParameterKind.Header,
Schema = new JsonSchema { Type = JsonObjectType.String },
IsRequired = true,
Description = "Description",
Default = "Default Value"
});