增加自定的方法修改已经生成的 swagger 文档
builder.Services.AddSwaggerGen(opt =>
{
opt.OperationFilter<ApplyOptionalRouteParameterOperationFilter>();
}
public partial class ApplyOptionalRouteParameterOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Parameters.Count == 0) return;
var attrs = context.MethodInfo.GetCustomAttributes(true)
.Concat(context.MethodInfo.DeclaringType?.GetCustomAttributes(true) ?? [])
.OfType<IRouteTemplateProvider>().Where(x => x.Template?.Contains('?')??false).ToList();
foreach (var route in attrs)
{
var matches = RouteTemplateRegex().Matches(route.Template??"");
foreach (Match match in matches)
{
var name = match.Groups["name"].Value;
var parameter = operation.Parameters.FirstOrDefault(x => x.Name == name);
if (parameter is not null)
{
parameter.AllowEmptyValue = true;
parameter.Required = false;
parameter.Schema.Nullable = true;
}
}
}
}
[GeneratedRegex(@"\{(?<name>\w+)(\:\w+)*\?\}")]
private static partial Regex RouteTemplateRegex();
}