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

问题描述:

假定以下网址:C#ASP.NET HttpWebRequest自动解析查询字符串的&符号(&)值?

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

我使用HttpUtility.UrlEncode()来编码文件名参数的值和创建下面的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的值。我错过了什么吗?

QueryString属性返回NameValueCollection对象,该对象将查询字符串键映射到完全解码的值。您需要编写Request.QueryString["FileName"]

+0

感谢您的答案,但这并不奏效。 – Ioannis 2010-09-08 13:14:16

+0

它返回:文件(价值之后&丢失) – Ioannis 2010-09-08 13:14:57

当您不使用UrlEncode时会发生什么?你没有说明你是如何使用你使用UrlEncode创建的url,所以事情很可能是双重编码的(很多框架会自动为你编码)。

+0

那么,如果我不使用UrlEncode并发送它像“http://server/application1/TestFile.aspx?Library = Testing&Filename = Documents&Functions + Properties.docx&Save = true“然后在服务器上我之前提到的变量具有相同的值,因此无论我使用UrlEncode还是不是我在服务器上都得到相同的结果 – Ioannis 2010-09-08 15:10:41

+0

无论如何,我想出了一个解决方案,我用我的自定义编码器/解码器手动编码文件名的值,它工作正常。 – Ioannis 2010-09-08 15:13:05

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

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

一对夫妇的解决方法,这一问题:

  1. 实现自己的查询字符串解析服务器上。这并不好玩,但它很有效。
  2. 双编码&号。首先对字符串中的&符号进行编码,然后对整个字符串进行编码。 (这是一个简单的解决方案,但不能扩展,因为它把负担放在客户端上。)