2010-03-26 82 views
1

我有一個運行HttpHandler類的Web服務。在這個類中,我檢查了表單/查詢字符串參數的請求流。在某些情況下,似乎這些參數沒有通過。經過一番挖掘,我發現了一些我不太明白的行爲。見下:奇數HttpRequest行爲

 
// The request contains 'a=1&b=2&c=3' 
// TEST ONLY: Read the entire request 
string contents; 
using (StreamReader sr = new StreamReader(context.Request.InputStream)) 
{ 
    contents = sr.ReadToEnd(); 
} 
// Here 'contents' is usually correct - containing 'a=1&b=2&c=3'. Sometimes it is empty. 

string a = context.Request["a"]; 

// Here, a = null, regardless of whether the 'contents' variable above is correct 

任何人都可以向我解釋爲什麼這可能會發生?如果這有什麼區別,我正在使用.NET WebClient和UploadDataAsync在客戶端上執行請求。

如果您需要更多信息,請讓我知道。

+0

爲什麼不使用'context.Request.QueryString'? – 2010-03-26 17:06:34

回答

0

你爲什麼要檢查查詢字符串參數的請求流? .Net中有許多內置的類型來處理HTTP請求。您可以使用以下代碼輕鬆地從querystring中獲取正確的NameValueCollection;

NameValueCollection queryStringValues = 
    HttpUtility.ParseQueryString(HttpContext.Current.Request.Query.ToLower()); 

string value = queryStringValues["my_key"]; 

在你的代碼有StreamReader讀取流,並指定這叫做contents一個字符串變量。但是,如果將值分配給字符串a,則可以訪問一個名爲context的變量,我認爲它的確是HttpContext.Current。然後,您使用Request對象作爲NameValueCollection。當您訪問Request集合時,它會查找同時檢查Request.FormRequest.QueryString的POST和GET參數。

除非HTTP請求管道進一步改變請求enroute,否則不會丟失參數。使用代理工具(如FiddlerCharles)在請求離開瀏覽器時檢查該請求。

+0

感謝您的回覆。我沒有檢查查詢字符串參數,我正在檢查GET或POST數據的請求(即Content-Type:application/x-www-form-urlencoded)。在這種情況下,數據是POST-ed的,所以我期望使用Request []索引器來檢查QueryString和Form集合。但似乎沒有。 我目前正在通過使用GET參數來避開它,但我更喜歡使用POST,如果我可以讓它正常工作。 – Barg 2010-03-26 17:28:07