Swagger 配置
# 进行参数修改
builder.Services.AddSwaggerGen(opt => {});

修改标题

opt.SwaggerDoc("v1", new OpenApiInfo { Title = "Test01", Version = "v1", });

在 header 中加入授权输入的支持

      opt.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Name = "JWT",
        Type = SecuritySchemeType.Http,
        Scheme = "Bearer",
        In = ParameterLocation.Header,
        Description = "JWT Authorization header using the Bearer scheme.",
    });

    opt.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer",
                },
            },
            []
        },
    });

函数中带有 FromHeader 时显示 header 值输入框

注:已经不再需要扩展,函数中使用 FromHeader 及 Required 时 swagger 界面中自动生成输入框, 只是名称不能使用 Authorization

# 加载扩展
opt.OperationFilter<FromHeaderParameterFilter>();
# 实现扩展
public class FromHeaderParameterFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        operation.Parameters ??= new List<OpenApiParameter>();

        var descriptions = context.ApiDescription.ParameterDescriptions;
        foreach (var description in descriptions)
        {
            if (description.ParameterDescriptor is not ControllerParameterDescriptor controllerParameterDescriptor)
            {
                continue;
            }

            // 函数参数是否使用了 [FromHeader] 特性, 并且是否使用了 [Required] 特性
            var headerAttribute = controllerParameterDescriptor.ParameterInfo.GetCustomAttribute<FromHeaderAttribute>();
            var required = controllerParameterDescriptor.ParameterInfo.GetCustomAttribute<RequiredAttribute>() != null;

            if (headerAttribute == null)
            {
                continue;
            }

            // 使用 [FromHeader] 特性的中的名称,注意不要使用 Authorization , 会与全局设置有兼容问题
            var name = string.IsNullOrWhiteSpace(headerAttribute.Name) ? "ApiKey" : headerAttribute.Name;

            // 设置输入框的参数
            operation.Parameters.Add(new OpenApiParameter
            {
                Name = name,
                In = ParameterLocation.Header,
                Description = "api key",
                Required = required,
                Schema = new OpenApiSchema
                {
                    Type = "string",
                    /*Default = new OpenApiString("Bearer "),*/
                },
            });
        }
    }
}
# FromHeader 的函数自动显示输入框
    [HttpPost("asymDecrypt")]
    public async Task<ActionResult<string>> AsymDecrypt([FromHeader(Name = "ApiKey")] [Required] string token)
    {
        var rsa = RSA.Create();
        rsa.FromXmlString(PublicAsynKeyXml);

        return await ParseJwtTokenAsync(token, new RsaSecurityKey(rsa));
    }

加入 注释功能

# 设置编译自动生成 xml 文件 

    // 获取 XML 文件路径(根据项目名称调整)
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFilename);

    // 启用 XML 注释
    opt.IncludeXmlComments(xmlPath);
上一篇
下一篇