You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:54:20