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

如何禁用Swagger对通配符路径参数的URL编码?

解决ASP.NET Core代理端点Swagger对通配符参数URL编码的问题

方法一:自定义Swashbuckle参数过滤器

创建参数过滤器,专门处理subPath这类通配符路径参数,告知Swagger不对其进行URL编码:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

public class UnencodedPathParameterFilter : IParameterFilter
{
    public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
    {
        if (parameter.Name.Equals("subPath", StringComparison.OrdinalIgnoreCase) 
            && parameter.In == ParameterLocation.Path)
        {
            parameter.Style = ParameterStyle.Simple;
            parameter.Explode = false;
            parameter.Schema.Pattern = @"^.*$";
        }
    }
}

在Program.cs(或Startup.cs)中注册该过滤器:

builder.Services.AddSwaggerGen(c =>
{
    c.ParameterFilter<UnencodedPathParameterFilter>();
    // 其他Swagger配置项
});

方法二:修改Swagger UI前端行为

若过滤器方案不生效,可直接修改Swagger UI的请求发送逻辑,在请求发出前解码subPath参数:

在Program.cs的Swagger UI配置中注入自定义脚本:

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    c.InjectJavascript("/swagger-custom.js");
});

在wwwroot目录下创建swagger-custom.js文件,内容如下:

(function() {
    var originalFetch = window.fetch;
    window.fetch = function(url, options) {
        var decodedUrl = url.replace(/%2F/g, '/');
        return originalFetch(decodedUrl, options);
    };
})();

方法三:调整路由与参数绑定(备选)

如果上述方法均不适用,可将subPath改为查询参数,再手动拼接路径:

修改控制器路由:

[Route("{servicename}")]
public async Task<IActionResult> Proxy(string servicename, [FromQuery] string subPath)
{
    var targetPath = $"{servicename}/{subPath}";
    // 后续请求转发逻辑
}

这种方式下Swagger会将subPath作为查询参数处理,不会编码斜杠,只需在代码中手动拼接成目标路径即可。

内容的提问来源于stack exchange,提问作者Emil Bode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:42:35