Swagger UI生成多余斜杠致Web Api路由匹配失败问题求助
修复Swagger UI调用可选路由参数时URL末尾多斜杠导致404的问题
问题场景
已配置Swagger支持可选路由参数,接口定义如下:
[SwaggerOperationFilter(typeof(OptionalRouteParameterOperationFilter))] [HttpGet("[action]/{someId}/{anotherId}/{startDate?}/{endDate?}")] public ActionResult<IEnumerable<Model>> GetSomething(int someId, int anotherId, [FromRoute] DateTime? startDate = null, [FromRoute] DateTime? endDate = null)
使用Postman调用该接口完全正常,但通过Swagger UI调用时,生成的URL存在末尾多余斜杠:
https://localhost:5001/api/SomeController/GetSomething/55/67//
该问题直接导致接口返回404错误:
Error: response status is 404
注:无需推荐查询字符串方案。
补充配置信息
Startup中的Swagger配置
services.AddSwaggerGen(opt => { opt.EnableAnnotations(); opt.DescribeAllParametersInCamelCase(); });
自定义OptionalRouteParameterOperationFilter类(已移除无关代码)
public class OptionalRouteParameterOperationFilter : IOperationFilter { // ... 无关代码省略 public void Apply(OpenApiOperation operation, OperationFilterContext context) { // ... 无关代码省略 var parameter = operation.Parameters.FirstOrDefault(p => p.In == ParameterLocation.Path && p.Name == name); if (parameter != null) { parameter.AllowEmptyValue = true; parameter.Description = "<b>***</b>Check <i>\"Send empty value\"</i> for correct empty parameter operation"; parameter.Required = false; parameter.Schema.Nullable = true; } // ... 无关代码省略 } }
修复方案
问题根源是Swagger UI会为未填写的可选路由参数保留空路径段,进而生成带多余斜杠的URL。只需修改自定义的OptionalRouteParameterOperationFilter,调整Swagger生成的路径模板即可解决:
修改OptionalRouteParameterOperationFilter的实现
public class OptionalRouteParameterOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 获取接口原始路由模板 var routeTemplate = context.ApiDescription.RelativePath; if (string.IsNullOrWhiteSpace(routeTemplate)) return; // 筛选出所有可选的路由参数 var optionalPathParams = context.ApiDescription.ParameterDescriptions .Where(p => p.Source == BindingSource.Path && p.IsOptional) .Select(p => p.Name); // 移除路由模板中的可选参数占位符,并清理连续斜杠 foreach (var paramName in optionalPathParams) { var placeholder = $"{{{paramName}?}}"; routeTemplate = routeTemplate.Replace(placeholder, string.Empty).Replace("//", "/"); } // 更新Swagger操作的路径 operation.Path = routeTemplate; // 保留原有的参数配置逻辑 var parameter = operation.Parameters.FirstOrDefault(p => p.In == ParameterLocation.Path && p.Name == name); if (parameter != null) { parameter.AllowEmptyValue = true; parameter.Description = "<b>***</b>勾选「发送空值」以正确传递空参数"; parameter.Required = false; parameter.Schema.Nullable = true; } } }
效果验证
修改后,当不填写startDate和endDate时,Swagger UI生成的URL为:
https://localhost:5001/api/SomeController/GetSomething/55/67
不再有末尾多余斜杠,接口可正常返回数据。
内容的提问来源于stack exchange,提问作者T.S.
相关产品推荐
相关产品推荐

