Request.Querystring自动url解码字符串?

时间:2012-10-26 22:44:32

标签: c# asp.net c#-4.0 url url-rewriting

我正在使用一个页面,我有一个网址: /目录/公司/制造商

使用一些重写规则可以重写

使用/ directory / company / dunkin%26donuts /

进行测试

有些制造商的名字中有一个&符号。所以我想我可以用%26替换&符号。但是,当我调试代码并将鼠标悬停在Request.QueryString上时,它会显示{qq=company&manf=dunkin&donuts&cond=}Request.QueryString["manf"]会给我'dunkin'

如果我使用%24($)代替&符号,则将鼠标悬停在Request.QueryString上会给我 {qs=company&manf=dunkin%24donuts&cond=}Request.QueryString["manf"]给了我'dunkin $ donuts'

我不明白这里的不同行为。为什么在实际请求特定密钥之前,似乎&符号的url编码值会被解码,但是另一个url编码的字符,如美元符号,只有在您实际请求该特定密钥后才会被解码?

这是最近的变化吗?我一直认为Request.QueryString[key]返回实际文本而不先解码它。或者它与网址重写有什么关系?

3 个答案:

答案 0 :(得分:35)

当您按密钥索引(即UrlDecode())访问属性时,ASP.NET会自动调用Request.QueryString["key"]

如果您想对其进行编码,请执行以下操作:

HttpUtility.UrlEncode(Request.QueryString["key"]);

就特殊情况而言,这是一个特殊情况字符,因为它已经被用作查询字符串分隔符。 URL编码和解码&符号应始终为您提供&

答案 1 :(得分:9)

使用%26替换“&”符号会导致该值被转义,因此Request.QueryString["manf"]会产生dunkin&donuts

this similar question的提问者最终意识到同一页面上的其他一些代码最终预先解码了他的&符号。你有可能发生类似的事吗?也许有些javascript会在将%26发送到您的服务器之前将其解码为&符号。尝试使用Firebug或Chrome的开发人员工具查看从浏览器发送的实际URL字符串。

更新

再次查看问题后,我意识到您可能正在使用URL重写器。 This post描述了类似的问题,我不确定解决方案,但您可能希望尝试使用%2526代替%26对&符号进行双重编码。

答案 2 :(得分:3)

我认为解决方案可能是将UrlRewrite规则修改为类似的内容。

    <rule name="TagPage" stopProcessing="true">
      <match url="^(tag)/([^/]+)/?$"/>
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
      </conditions>
      <action type="Rewrite" url="ListByTags.aspx?tag={UrlEncode:{R:2}}"/>
    </rule>

这里重要的一行是{UrlEncode:{R:2}}。它解决了我的问题!