如何为ASP.NET HttpPut原始参数配置Swagger的format、pattern和maxlength?
解决方案
方法1:给路由参数添加数据注解特性
直接在方法的参数上结合[FromRoute]和数据验证特性,这些特性会被Swagger自动识别并生成对应的文档信息:
[HttpPut("{servicenumber}/{date}/{page}/{fileVersion}")] public async Task<IActionResult> GenerateServiceRecord( [FromRoute, StringLength(4, MaximumLength = 4)] // 配置max length [RegularExpression(@"^\d{4}$")] // 配置pattern string servicenumber, [FromRoute, DisplayFormat(DataFormatString = "yyyy-MM-dd")] // 配置date的format string date, string page, string fileVersion) { // 业务逻辑实现 }
[StringLength]用来定义参数的最大长度[RegularExpression]用来指定参数必须匹配的正则模式[DisplayFormat]可以设置参数的格式规则
这些特性不仅能同步到Swagger文档,还能自动完成请求参数的合法性校验。
方法2:自定义Swagger操作过滤器(复杂场景适用)
如果需要更灵活的规则配置,可以实现IOperationFilter手动修改Swagger的参数元数据:
- 创建过滤器类:
public class RouteParameterSchemaFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 配置servicenumber的规则 var servicenumberParam = operation.Parameters.FirstOrDefault(p => p.Name == "servicenumber"); if (servicenumberParam != null) { servicenumberParam.Schema.MaxLength = 4; servicenumberParam.Schema.Pattern = @"^\d{4}$"; } // 配置date的规则 var dateParam = operation.Parameters.FirstOrDefault(p => p.Name == "date"); if (dateParam != null) { dateParam.Schema.Format = "yyyy-MM-dd"; dateParam.Schema.Pattern = @"^\d{4}-\d{2}-\d{2}$"; } } }
- 在Swagger配置中注册过滤器:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); c.OperationFilter<RouteParameterSchemaFilter>(); });
为什么之前的配置没生效?
你之前在路由模板里写的{servicenumber:length(4)}是ASP.NET Core的路由约束,它仅用于请求路由匹配时的参数校验,不会自动同步到Swagger的文档元数据中,所以Swagger文档不会显示这些规则。
内容的提问来源于stack exchange,提问作者Micah Armantrout
相关产品推荐
相关产品推荐

