在.net 6.0中将swagger的控制器名称替换为中文注释
默认情况下,如果我有一个名为ShippingController的控制器,则swagger生成的UI名称为“Shipping”,我想把我的控制器的名字改成更友好的或者用另一种语言写的。
我能找到的最好的办法是用一个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
{
// 实现 IControllerModelConvention 接口的方法
void IControllerModelConvention.Apply(ControllerModel controller)
{
// 如果控制器为 null,则返回
if (controller == null)
return;
// 遍历控制器的所有属性
foreach (var attribute in controller.Attributes)
{
// 判断属性是否为 RouteAttribute
if (attribute.GetType() == typeof(RouteAttribute))
{
// 将属性强制转换为 RouteAttribute
var routeAttribute = (RouteAttribute)attribute;
// 如果 RouteAttribute 的 Name 属性不为空,则将控制器的名称设置为 Name 的值
if (!string.IsNullOrWhiteSpace(routeAttribute.Name))
controller.ControllerName = routeAttribute.Name;
}
}
}
}
}
步骤2:启动.cs:
修改StartUp.cs或Program.cs文件,并在配置服务中,我们需要在约定列表中注册我们的类。请参见以下内容:
services.AddControllers(o =>
{
o.Conventions.Add(new ControllerDocumentationConvention());
});
步骤3:在每个控制器的Route属性中添加名称属性:
[ApiController]
[ApiVersion("1.0")]
[ApiExplorerSettings(IgnoreApi = false, GroupName = "v1")]
[Route("api/Envios/{version:apiVersion}", Name = "Envios", Order = 1)]
[Produces("application/json")]
public class ShippingController
现在,当我运行应用程序并生成我的swagger时,您可以看到控制器名称已更改为与route attributes name属性中的文本相同。
参考自:https://www.saoniuhuo.com/question/detail-2169004.html