Есть ли способ изменить имя контроллера на странице swagger-ui?

Я использую Swashbuckle, чтобы включить использование swagger и swagger-ui в моем проекте WebApi.

На следующем изображении вы можете увидеть два моих контроллера, показанных на странице swagger-ui. Они названы так, как они есть в коде С#, однако мне было интересно, есть ли способ изменить то, что показано здесь?

Это происходит главным образом потому, что, как вы видите, ManagementDashboardWidget не является удобным для пользователя именем, поэтому я хочу изменить его, чтобы оно было удобным для пользователя.

swagger-ui

Ответ 1

Вы можете использовать теги для этого. По умолчанию Swashbuckle добавляет тег с именем контроллера для каждой операции. Вы можете переопределить это с помощью SwaggerOperationAttribute. Например, следующая строка заменяет тег по умолчанию "Значения" тегом Test:

public class ValuesController : ApiController
{
    [SwaggerOperation(Tags = new[] { "Test" })]
    public IHttpActionResult Get()
    {
        // ...
    }
}

Операция Get теперь будет помещена в группу Test.

Если вы хотите, чтобы операция отображалась в нескольких группах, вы можете добавить больше тегов. Например:

[SwaggerOperation(Tags = new[] { "Test", "Release1" })]

поместит операцию Get в группы Test и Release1.

Ответ 2

Я попытался использовать ответ venerik, но он по-прежнему сохранял исходное имя контроллера в пользовательском интерфейсе вместе с новым указанным вами тегом. Мне также не понравилось, что вам пришлось добавлять атрибут для каждой функции, поэтому я нашел решение, в котором вам нужно только добавить атрибут в контроллер. Есть два шага:

Добавьте DisplayNameAttribute на контроллер:

[DisplayName("Your New Tag")]
public class YourController : ApiController
{
    // ...
}

Затем в конфигурации Swagger вы можете переопределить базовую функциональность, используя функцию GroupActionsBy чтобы получить имя, указанное в этом атрибуте:

GlobalConfiguration.Configuration
    .EnableSwagger(c => {

        c.GroupActionsBy(apiDesc => {
            var attr = apiDesc
                .GetControllerAndActionAttributes<DisplayNameAttribute>()
                .FirstOrDefault();

            // use controller name if the attribute isn't specified
            return attr?.DisplayName ?? apiDesc.ControllerName(); 
        });

    })
    .EnableSwaggerUi(c => {
        // your UI config here
    });

Ответ 4

Если кто-то хочет сделать это на уровне контроллера/класса, ниже приводится очень полезная выдержка из здесь

используйте [ApiExplorerSettings (GroupName = "Group")] на своих контроллерах

Тогда в автозагрузке

services.AddSwaggerGen(options =>
{
options.SwaggerDoc(version,
    new Info
    {
        Title = name,
        Version = version
    }
);

options.DocInclusionPredicate((_, api) => !string.IsNullOrWhiteSpace(api.GroupName));

options.TagActionsBy(api => api.GroupName);
});

Также обратите внимание, что

5.0.0-бета-версия swashbuckle теперь включает перегрузку TagActionsBy, которая поддерживает возврат массива тегов. Это должно позволить упростить вышеуказанные настройки