假设以下网址:
"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的值。我错过了什么吗?
答案 0 :(得分:2)
QueryString
属性返回一个NameValueCollection
对象,该对象将查询字符串键映射到完全解码的值。
您需要撰写Request.QueryString["FileName"]
。
答案 1 :(得分:2)
我多年后回答这个问题,因为我刚遇到这个问题并想出了解决方案。问题是HttpRequest.Url
并不是您提供的价值。 HttpRequest.Url
是Uri
类,该值是该类的ToString()
值。 Uri类的ToString()
解码了Url。相反,您要使用的是HttpRequest.Url.OriginalString
。这是您要查找的URL的编码版本。希望这有助于未来有这个问题的人。
答案 2 :(得分:1)
不使用UrlEncode会发生什么?您没有显示您使用UrlEncode创建的URL的确切程度,因此很可能只是对事物进行了双重编码(很多框架会自动为您编码URL)。
答案 3 :(得分:0)
FWIW我遇到了与RavenDB(版本960)相同的问题。他们实现了自己的HttpRequest对象,其行为与此类似 - 它首先解码&符号(从%26
到&
),然后解码整个值。我相信这是一个错误。
解决此问题的几种解决方法: