C#ASP.NET HttpWebRequest自动解码查询字符串中的&符号(&)值?

时间:2010-09-08 12:53:13

标签: c# asp.net query-string decode ampersand

假设以下网址:

"http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents & Functions + Properties.docx&Save=true"

我使用HttpUtility.UrlEncode()来编码Filename参数的值,然后创建以下Url:

"http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents%20%26%20Functions%20%2B%20Properties.docx&Save=true"

我将来自客户端的以下(编码版本)请求发送到C#Web应用程序。在处理请求的服务器上我遇到了问题。 HttpRequest变量包含部分解码的查询字符串。也就是说当我尝试使用或快速观察HttpRequest的以下属性时,它们具有以下值。

Property = Value
================
HttpRequest.QueryString = "{Library=Testing&Filename=Documents+&+Functions+++Properties.docx&Save=true}"

HttpRequest.Url = "{http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents & Functions + Properties.docx&Save=true}"

HttpRequest.Url.AbsoluteUri = "http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents%20&%20Functions%20+%20Properties.docx&Save=true"

我还检查了以下属性,但所有属性都有&价值解码。但是,所有其他值仍然正确编码(例如,空格为%20)。

HttpRequest.Url.OriginalString

HttpRequest.Url.Query

HttpRequest.Url.PathAndQuery

HttpRequest.RawUrl

我无法正确读取参数Filename的值。我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

QueryString属性返回一个NameValueCollection对象,该对象将查询字符串键映射到完全解码的值。

您需要撰写Request.QueryString["FileName"]

答案 1 :(得分:2)

我多年后回答这个问题,因为我刚遇到这个问题并想出了解决方案。问题是HttpRequest.Url并不是您提供的价值。 HttpRequest.UrlUri类,该值是该类的ToString()值。 Uri类的ToString()解码了Url。相反,您要使用的是HttpRequest.Url.OriginalString。这是您要查找的URL的编码版本。希望这有助于未来有这个问题的人。

答案 2 :(得分:1)

不使用UrlEncode会发生什么?您没有显示您使用UrlEncode创建的URL的确切程度,因此很可能只是对事物进行了双重编码(很多框架会自动为您编码URL)。

答案 3 :(得分:0)

FWIW我遇到了与RavenDB(版本960)相同的问题。他们实现了自己的HttpRequest对象,其行为与此类似 - 它首先解码&符号(从%26&),然后解码整个值。我相信这是一个错误。

解决此问题的几种解决方法:

  1. 在服务器上实现您自己的查询字符串解析。这不好玩,但它很有效。
  2. 双重编码&符号。首先只编码字符串中的&符号,然后编码整个字符串。 (这是一个简单的解决方案,但不可扩展,因为它会给客户带来负担。)