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"]
。
当您不使用UrlEncode时会发生什么?你没有说明你是如何使用你使用UrlEncode创建的url,所以事情很可能是双重编码的(很多框架会自动为你编码)。
那么,如果我不使用UrlEncode并发送它像“http://server/application1/TestFile.aspx?Library = Testing&Filename = Documents&Functions + Properties.docx&Save = true“然后在服务器上我之前提到的变量具有相同的值,因此无论我使用UrlEncode还是不是我在服务器上都得到相同的结果 – Ioannis 2010-09-08 15:10:41
无论如何,我想出了一个解决方案,我用我的自定义编码器/解码器手动编码文件名的值,它工作正常。 – Ioannis 2010-09-08 15:13:05
多年后我回答了这个问题,因为我刚刚遇到了这个问题并找出了解决方案。问题是HttpRequest.Url
不是你给的价值。 HttpRequest.Url
是Uri
类,该值是该类的ToString()
值。为Uri类的ToString()
解码Url。相反,你想要使用的是HttpRequest.Url.OriginalString
。这是您正在查找的URL的编码版本。希望这有助于一些未来的人有这个问题。
FWIW我遇到了与RavenDB(版本960)相同的问题。他们实现了自己的HttpRequest对象,其行为就像这样 - 它首先解码&符号(从%26
到&
),然后解码整个值。我相信这是一个错误。
一对夫妇的解决方法,这一问题:
- 实现自己的查询字符串解析服务器上。这并不好玩,但它很有效。
- 双编码&号。首先对字符串中的&符号进行编码,然后对整个字符串进行编码。 (这是一个简单的解决方案,但不能扩展,因为它把负担放在客户端上。)
感谢您的答案,但这并不奏效。 – Ioannis 2010-09-08 13:14:16
它返回:文件(价值之后&丢失) – Ioannis 2010-09-08 13:14:57