Request.Querystring自动url解码一个字符串?
我正在使用我有一个url的页面:
/目录/公司/制造商
使用一些重写规则,这将被重写
使用/ directory / company / dunkin%26donuts /进行测试
一些制造商的名字中有一个&符号。 所以我想我可以用%26
替换&符号。 但是,当我调试代码并将鼠标hover在Request.QueryString
它显示我{qq=company&manf=dunkin&donuts&cond=}
而Request.QueryString["manf"]
给了我’dunkin’
如果我使用%24
($)而不是&符号,将{qs=company&manf=dunkin%24donuts&cond=}
hover在Request.QueryString
会给我{qs=company&manf=dunkin%24donuts&cond=}
而Request.QueryString["manf"]
会给我’dunkin $ donuts’
我不明白这里的不同行为。 为什么在实际请求特定密钥之前,似乎&符号的url编码值会被解码,但是另一个url编码的字符,如美元符号,只有在您实际请求该特定密钥后才会被解码?
这是最近的变化吗? 我一直认为Request.QueryString[key]
返回实际文本而不先解码它。 或者它与url重写有什么关系?
用%26
替换&符应该导致该值被转义,因此Request.QueryString["manf"]
将产生dunkin&donuts
。
这个类似问题的提问者最终意识到同一页面上的其他一些代码最终预先解码了他的&符号。 你有可能发生类似的事吗? 也许有些javascript将%26
解码为&符号,然后再将其发送到您的服务器。 尝试使用Firebug或Chrome的开发人员工具查看从浏览器发送的实际URL字符串。
更新
在再次查看问题后,我意识到您可能正在使用URL重写器。 这篇文章描述了一个类似的问题,我不确定解决方案,但您可能想尝试使用%2526
而不是%26
对&符号进行双重编码。
当您通过键索引访问属性时,ASP.NET会自动调用UrlDecode()
(即( Request.QueryString["key"]
)。
如果你想要它编码,只需:
HttpUtility.UrlEncode(Request.QueryString["key"]);
特别是在&符号方面,这是一个特殊情况字符,因为它已经被用作查询字符串分隔符。 URL编码和解码&符号应该总是给你&
出于这个原因。
我认为解决方案可能是将UrlRewrite规则修改为类似的。
这里重要的一行是{UrlEncode:{R:2}}。 它解决了我的问题!