2010-09-08 90 views
3

假定以下網址: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的值。我錯過了什麼嗎?

回答

2

QueryString屬性返回NameValueCollection對象,該對象將查詢字符串鍵映射到完全解碼的值。您需要編寫Request.QueryString["FileName"]

+0

感謝您的答案,但這並不奏效。 – Ioannis 2010-09-08 13:14:16

+0

它返回:文件(價值之後&丟失) – Ioannis 2010-09-08 13:14:57

1

當您不使用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

2

多年後我回答了這個問題,因爲我剛剛遇到了這個問題並找出瞭解決方案。問題是HttpRequest.Url不是你給的價值。 HttpRequest.UrlUri類,該值是該類的ToString()值。爲Uri類的ToString()解碼Url。相反,你想要使用的是HttpRequest.Url.OriginalString。這是您正在查找的URL的編碼版本。希望這有助於一些未來的人有這個問題。

0

FWIW我遇到了與RavenDB(版本960)相同的問題。他們實現了自己的HttpRequest對象,其行爲就像這樣 - 它首先解碼&符號(從%26&),然後解碼整個值。我相信這是一個錯誤。

一對夫婦的解決方法,這一問題:

  1. 實現自己的查詢字符串解析服務器上。這並不好玩,但它很有效。
  2. 雙編碼&號。首先對字符串中的&符號進行編碼,然後對整個字符串進行編碼。 (這是一個簡單的解決方案,但不能擴展,因爲它把負擔放在客戶端上。)