Есть ли способ изменить имя контроллера на странице 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
});
Ответ 3
Я боролся с этим, используя Swashbucle 4.0.x и .NET Core 2.x, я нашел правильный начальный путь здесь вместе с опубликованным обновлением: Есть ли в Swagger (Asp.Net Core) описание контроллера?
Ответ 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, которая поддерживает возврат массива тегов. Это должно позволить упростить вышеуказанные настройки