当 url 包含编码的 & 符号时,MVC WEB API 路由失败

Posted

技术标签:

【中文标题】当 url 包含编码的 & 符号时,MVC WEB API 路由失败【英文标题】:MVC WEB API routing fails when url contains encoded ampersand 【发布时间】:2012-12-30 19:47:43 【问题描述】:

当我调用我的网络服务女巫时,我得到了两个参数:

从客户端 (&) 检测到具有潜在危险的 Request.Path 值。

路由配置:

config.Routes.MapHttpRoute(
name: "PropertiesSearch",
routeTemplate: "api/property/Search/category/query",
defaults: new  controller = "Property", action = "Search", category = "common", query = string.Empty 
);

控制器方法:

[HttpGet]
public SearchResult Search(string category, string query)


当我调用 api 时:

/api/property/search/homes/areaId%3D20339%26areaId%3D20015

从客户端 (&) 检测到具有潜在危险的 Request.Path 值。

这样做:

/api/property/search/homes/?query=areaId%3D20339%26areaId%3D20015

工作正常。

如何解决路由解码问题?

【问题讨论】:

【参考方案1】:

斯科特·汉塞尔曼blogged about this。您可能需要检查 web.config 中 <httpRuntime> 节点的 requestPathInvalidCharacters 属性。

我个人会避免在 uri 部分中使用此类字符,而只是将这些值作为查询字符串参数。

【讨论】:

+1 就我个人而言,我会避免 uri 部分中的此类字符,并简单地将这些值作为查询字符串参数。不能再大胆了。 你是对的。我们让它与 web.config 绕过一起工作,但最终还是强制它使用查询字符串参数进行设置。我们希望它成为 URL 的一部分的原因是因为我们使用自动生成的帮助页面来创建 API 参考。而routeTemplate 不允许我们在其中包含?,因此没有好的方法告诉用户使用查询参数包含query @ErikPhilips 为什么要避免在 URI 的路径部分使用完全有效的字符(&、= 等)?与号字符仅保留在 URI 的查询部分中。 @JoshM 因为创建requestpathInvalidCharacters 有非常好的、正当的理由......因为要求不高而一时兴起绕过它并不是关闭它的好理由。跨度> @ErikPhilips 完成:***.com/questions/35653835/…

以上是关于当 url 包含编码的 & 符号时,MVC WEB API 路由失败的主要内容,如果未能解决你的问题,请参考以下文章

编码请求主体

Python-Url编码和解码

当 URL 包含百分比符号时如何停止错误 400? (阿帕奇)

URL编码与解码

URL编码与解码

URL编码与解码