Как реализовать Swashbuckle IOperationFilter, который обрабатывает настраиваемые атрибуты в .NET Core
Я реализовал Swashbuckle.Swagger.IOperationFilter
для обработки настраиваемых атрибутов, как описано здесь: /questions/5241545/kak-otobrazit-swaggerresponse-v-xml-vmesto-json/5241553#5241553
Теперь я хочу сделать что-то подобное для Swashbuckle.AspNetCore 5.0.0
.
Похоже, что ApiDescription
класс не имеет метода расширения GetControllerAndActionAttributes
это использовалось в исходной реализации. Я попытался реализовать его заново, посмотрев на его исходный код, но он использует членыApiDescription.ActionDescriptor.ControllerDescriptor
а также ApiDescription.ActionDescriptor.GetCustomAttributes<TAttribute>
что я не существую для.NET Core.
Может ли кто-нибудь помочь мне начать работу, показав, как получить настраиваемые атрибуты контроллера и действия из IOperationFilter
?
Обновление Похоже, в реализации.NET Framework естьActionDescriptor
это на самом деле ReflectedActionDescriptor. У этого класса есть конструктор, который принимаетMethodInfo
, который используется для поиска атрибутов.
Но я не вижу возможности получить MethodInfo
для реализации.NET Core Microsoft.AspNetCore.Mvc.Abstractions.ActionDescriptor.
3 ответа
Я нашел свой ответ: есть способ расширения ApiDescription.TryGetMethodInfo
что получит MethodInfo
и, следовательно, предоставить доступ к настраиваемым атрибутам.
Это то, что я делаю в .NET 6 для реализации версии OpenApi. В этом примере используется атрибут описания System.ComponentModel для моей документации swagger для метода. Создайте класс, который реализует IOperationFilter
public class CustomSwaggerOperationFilter : IOperationFilter {
public void Apply(OpenApiOperation operation, OperationFilterContext context) {
if (context.MethodInfo.GetCustomAttributes(typeof(DescriptionAttribute), false)?.FirstOrDefault() is DescriptionAttribute descriptionAttribute) {
operation.Description = descriptionAttribute.Description;
}
}
}
Затем при настройке swagger в Program.cs
builder.Services.AddSwaggerGen(options => {
options.SwaggerDoc("v1", new OpenApiInfo {
Version = "v1",
Title = "My API",
Description = "My Api Description"
});
options.OperationFilter<CustomSwaggerOperationFilter>();
});
Теперь внутри контроллера над действием я могу просто использовать атрибут Description, и фильтр операции заставит swagger использовать его Пример метода в каком-то контроллере
[HttpGet]
[Description("Description for my Method Goes here")]
public async Task<SomeResponseModel> Get(CancellationToken cancellationToken) {
// Do Stuff here for response
}
Я использую сопоставление с образцом, и вы можете дополнительно настроить и добавить другие атрибуты или даже атрибуты, которые вы создаете сами, и повторить процесс поиска атрибута и значения, которое вы используете для своих документов swagger. Надеюсь, это поможет другим, так как большинство ответов были более старыми версиями ядра .net.
используйте этот код var attribute = apiDescription.GetControllerAndActionAttributes(); Бывший:
var attributes = apiDescription.GetControllerAndActionAttributes<AuthorizeAttribute>();
if (!attributes.IsNullOrEmpty())
{
var param = new Parameter
{
name = "Authorization",
@in = "header",
description = "Bearer + access token",
required = false,
type = "string"
};
if (operation.parameters == null)
operation.parameters = new List<Parameter> { param };
else
operation.parameters.Add(param);
}