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

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及更低版本,按以下步骤修改配置即可:

  1. 放开服务器的双转义拦截限制,允许路径携带%2F这类编码特殊字符
// IIS部署场景加这段
builder.Services.Configure<IISServerOptions>(options =>
{
    options.AllowDoubleEscaping = true;
});

// Kestrel自托管场景加这段
builder.WebHost.ConfigureKestrel(options =>
{
    options.AllowSynchronousIO = true;
});
  1. 在程序入口最开头(构建WebApplication之前)加全局开关,关闭路由自动解码路径的行为,避免编码斜杠被转成真实路径分隔符:
AppContext.SetSwitch("Microsoft.AspNetCore.Routing.SuppressInboundPathDecoding", true);
  1. 原有接口路由代码不需要做任何修改,重启应用即可正常匹配路径。
注意事项
  • 如果服务前挂了Nginx、CDN等反向代理,需要同步在代理层配置允许路径携带%2F编码字符,不要做自动解码或拦截,否则请求到达应用前就会被代理返回404。
  • 接口中拿到_url参数后,调用HttpUtility.UrlDecode(_url)解码即可得到原始URL地址。

内容的提问来源于stack exchange,提问作者Seyed Morteza Mousavifar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:45:30