Как реализовать 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);
        }
Другие вопросы по тегам