如何禁用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
相关产品推荐
相关产品推荐

