默认情况下,如果我有一个名为 ShippingController 的控制器,那么 swagger 会生成名为“Shipping”的 UI
我希望将控制器的名称更改为更友好的名称或其他语言。我能找到的最好方法是使用 SwaggerOperation 属性来更改名称,但这有一个限制,它是一个方法级别的属性,我真的不想在每个方法上指定名称。
所以,我创建了一个约定类来与控制器 Route 属性一起使用,我们通常在控制器上使用它,然后让 swagger 使用它作为控制器的名称。好吧,您知道属性上有一个 name 属性,但生成的 swagger 似乎没有使用它。
第 1 步:创建此类:
当应用程序启动时,它将运行它,如果我的控制器具有指定的属性,我将能够在控制器上查找 Route 属性,然后使用 name 属性更改控制器的名称。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace RestServices.Configuration.ConfigInstallers.Conventions
{
public class ControllerDocumentationConvention : IControllerModelConvention
{
void IControllerModelConvention.Apply(ControllerModel controller)
{
if (controller == null)
return;
foreach (var attribute in controller.Attributes)
{
if (attribute.GetType() == typeof(RouteAttribute))
{
var routeAttribute = (RouteAttribute)attribute;
if (!string.IsNullOrWhiteSpace(routeAttribute.Name))
controller.ControllerName = routeAttribute.Name;
}
}
}
}
}
第 2 步:Startup.cs:
修改 StartUp.cs 文件,在配置服务中我们需要在 Conventions 列表中注册我们的类。见下文:
services.AddControllers(o =>
{
o.Conventions.Add(new ControllerDocumentationConvention());
});
第 3 步:在每个控制器中,在 Route Attribute 中添加 name 属性:
[ApiController]
[ApiVersion("1.0")]
[ApiExplorerSettings(IgnoreApi = false, GroupName = "v1")]
[Route("api/Envios/{version:apiVersion}", Name = "Envios", Order = 1)]
[Produces("application/json")]
public class ShippingController
现在,当我运行应用程序并生成我的招摇时,您可以看到控制器名称已更改为与路由属性名称属性中的文本相同。