ASP.NET Core Web API路由传递URL参数404问题如何解决
问题根因
ASP.NET Core 默认会对请求路径做标准化解码,会将路径中编码后的斜杠%2F自动解码为真实路径分隔符/,同时默认安全策略会拦截包含双转义字符的路径,最终导致路径段数量和{_url}/{tokenPass}的两段路由模板不匹配,返回404错误。
解决方案
方案1:零服务配置改法(推荐,改动最小)
使用通配(catch-all)路由参数捕获带特殊字符的URL内容:
- 如果你用的是**.NET 7及以上版本**,框架支持通配参数放在路由中间位置,直接给
_url参数前加*标记即可,原有路径顺序不需要调整:
[HttpGet] [Route("GetShortURL/{*_url}/{tokenPass}")] [ApiExplorerSettings(GroupName = "ShortURL")] public ActionResult<ServiceResult<string>> GetShortURL(string _url, string tokenPass) { // 你的业务逻辑 }
- 如果你用的是**.NET 6及更低版本**,通配参数必须放在路由模板末尾,可以调整参数顺序把无特殊字符的
tokenPass放在前面,URL参数放在最后用通配捕获:
[HttpGet] [Route("GetShortURL/{tokenPass}/{*_url}")] [ApiExplorerSettings(GroupName = "ShortURL")] public ActionResult<ServiceResult<string>> GetShortURL(string _url, string tokenPass)
这个方案不需要修改任何服务端全局配置,框架会自动识别匹配包含斜杠的参数内容。
方案2:保留原有路径顺序,修改全局配置
如果你必须保持/GetShortURL/编码URL/tokenPass的路径顺序,且使用.NET 6及更低版本,按以下步骤修改配置即可:
- 放开服务器的双转义拦截限制,允许路径携带
%2F这类编码特殊字符
// IIS部署场景加这段 builder.Services.Configure<IISServerOptions>(options => { options.AllowDoubleEscaping = true; }); // Kestrel自托管场景加这段 builder.WebHost.ConfigureKestrel(options => { options.AllowSynchronousIO = true; });
- 在程序入口最开头(构建
WebApplication之前)加全局开关,关闭路由自动解码路径的行为,避免编码斜杠被转成真实路径分隔符:
AppContext.SetSwitch("Microsoft.AspNetCore.Routing.SuppressInboundPathDecoding", true);
- 原有接口路由代码不需要做任何修改,重启应用即可正常匹配路径。
注意事项
- 如果服务前挂了Nginx、CDN等反向代理,需要同步在代理层配置允许路径携带
%2F编码字符,不要做自动解码或拦截,否则请求到达应用前就会被代理返回404。 - 接口中拿到
_url参数后,调用HttpUtility.UrlDecode(_url)解码即可得到原始URL地址。
内容的提问来源于stack exchange,提问作者Seyed Morteza Mousavifar
相关产品推荐
相关产品推荐

