WebAPI GET请求查询字符串中星号(*)的处理方案咨询
我之前也碰到过一模一样的情况——IIS在请求到达控制器之前就把带星号的请求拦下来了,哪怕改了web.config的requestPathInvalidCharacters和用了[FromUri]都没用,完全摸不着头脑。后来才搞清楚,这是因为IIS和ASP.NET管道的拦截顺序问题,得从两个核心层面来配置:
1. 修改ASP.NET运行时的无效字符规则
首先,默认的web.config里,<httpRuntime>节点的requestPathInvalidCharacters是包含*的,ASP.NET会先拦截这类请求。你需要把星号从无效字符列表里移除,修改后的配置如下:
<system.web> <httpRuntime requestPathInvalidCharacters="<,>,%,&,\,?" /> </system.web>
注意:一定要确认星号已经从列表中删除,不然这个配置等于没生效。
2. 开启IIS的双重转义允许
光改ASP.NET的配置还不够,IIS的请求筛选模块会在更早的阶段拦截带特殊字符的请求。你需要在web.config的<system.webServer>节点下开启allowDoubleEscaping,让IIS允许这类字符通过:
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
这一步是关键——IIS的请求筛选是在ASP.NET管道之前执行的,如果不开启这个,请求根本到不了控制器的代码块。
3. 控制器中正确接收参数
当前面两步配置完成后,请求应该能正常到达控制器了。这时候建议直接用Request.QueryString来获取参数,比[FromUri]更直接,能避免路由解析的干扰:
public ActionResult Search() { var searchQuery = Request.QueryString["q"]; // 这里就能拿到带星号的查询内容了 // 你的搜索逻辑处理 return View(); }
如果一定要用[FromUri],要确保你的路由规则不会把查询字符串的星号误当成路由参数的一部分,比如避免使用{*catchall}这类通配符路由模板。
额外排查点:服务器级别的IIS设置
如果上面的配置还是不生效,可能是服务器级别的IIS请求筛选覆盖了你的站点配置。这时候需要打开IIS管理器,找到对应的站点,进入「请求筛选」设置,检查是否有拦截星号的规则,或者直接在服务器级别启用双重转义。
内容的提问来源于stack exchange,提问作者user287

