ASP.NET Core 6/7中URL路由参数编码解码的配置设置问询
ASP.NET Core 6/7中URL路由特殊字符的处理配置
针对路由参数包含反斜杠的场景,ASP.NET Core 6/7提供了以下几种方式控制特殊字符的处理与编码行为:
1. 允许路由参数包含反斜杠
默认情况下,ASP.NET Core路由参数的允许字符集不包含反斜杠(\),需通过配置添加该字符:
在Program.cs的路由服务配置中添加:
builder.Services.AddRouting(options => { options.AllowedCharacters.Add('\\'); });
配置后,路由参数可直接接收包含反斜杠的值:第三方客户端传递的Category1%5CSubCategory会被服务器自动解码为Category1\SubCategory;Swagger传递的Category1\\SubCategory(客户端转义后实际传输为单个反斜杠)也能被正常解析。
2. 调整Swagger的参数编码行为
若要让Swagger采用URL编码而非反斜杠转义的方式传递参数,可通过自定义操作过滤器实现:
首先定义过滤器类:
public class EncodeSpecialCharactersOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { if (operation.Parameters == null) return; foreach (var param in operation.Parameters) { if (param.Name == "categories" && param.In == ParameterLocation.Path) { // 指定参数采用URI组件编码方式 param.Encoding = new OpenApiEncoding { Style = ParameterStyle.Simple }; // 同步更新示例值为URL编码格式 if (param.Example != null) { param.Example = new OpenApiString(Uri.EscapeDataString(param.Example.ToString())); } } } } }
然后在Swagger服务配置中注册该过滤器:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); c.OperationFilter<EncodeSpecialCharactersOperationFilter>(); });
配置后,Swagger生成请求时会自动对categories参数进行URL编码(将\转为%5C)。
3. 全局自定义路径解码逻辑
如果需要更灵活的解码控制,可通过中间件手动处理请求路径:
app.Use(async (context, next) => { // 手动解码路径中的URL编码字符 var decodedPath = Uri.UnescapeDataString(context.Request.Path.Value ?? string.Empty); context.Request.Path = new PathString(decodedPath); await next(); });
注意该中间件需放在路由中间件(app.UseRouting())之前,确保路径先被处理再进入路由匹配流程。
内容的提问来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

