2008-10-31 20 views
28

我有以下的代碼,工作只是正常時的方法是「POST」,而是改爲「GET」不工作:如何使用HttpWebRequest的使用GET方法

HttpWebRequest request = null; 
request = HttpWebRequest.Create(uri) as HttpWebRequest; 
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 
request.Method = "POST"; // Doesn't work with "GET" 

request.BeginGetRequestStream(this.RequestCallback, null); 

我得到了ProtocolViolationException 「GET」方法的例外。

編輯:看過使用反射器後,似乎有一個明確的檢查「GET」方法,如果它被設置爲它拋出異常。

EDIT2:我已經更新了我的代碼以下,但它仍然拋出當我打電話EndGetResponse()異常

if (request.Method == "GET") 
{ 
    request.BeginGetResponse(this.ResponseCallback, state); 
} 
else 
{ 
    request.BeginGetRequestStream(this.RequestCallback, state); 
} 

在我的功能,ResponseCallback,我有這樣的:

HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 

它也拋出異常。

回答

上面的代碼現在工作,我已經忘了取出來這是導致異常在年底拋出的Content-Type行。 +1來調整&回答喬恩。

工作代碼現在如下:

HttpWebRequest request = null; 
request = HttpWebRequest.Create(uri) as HttpWebRequest; 
request.Method = "GET";// Supports POST too 

if (request.Method == "GET") 
{ 
    request.BeginGetResponse(this.ResponseCallback, state); 
} 
else 
{ 
    request.BeginGetRequestStream(this.RequestCallback, state); 
} 
+0

還是ProtocolViolationException?你能製作一個簡短但完整的程序來證明問題嗎?你有沒有看過線(例如Wireshark),看看發生了什麼? – 2008-10-31 14:28:42

+0

感謝您的更新..也解決了我的問題。 – TravisWhidden 2010-01-27 18:09:58

+0

這兩種方法是完全不同的 - 'BeginGetResponse`用於製作網頁請求,而`BeginGetRequestStream`用於將數據寫入流中。 – 2014-04-20 06:52:44

回答

5

是否有意義的GET請求發送內容類型?你嘗試刪除第三行嗎?

1

BeginGetRequestStream用於獲取專門用於將數據寫入請求的流。這不適用於GET請求。

BeginGetRequestStream方法的文檔明確指出,如果方法是GET或HEAD,該方法將拋出ProtocolViolationException。

士氣:閱讀文檔;-)

1

它的說明文件GetRequestStream,它會拋出一個ProtocolViolationException如果方法是GET規定。但是,我找不到HTTP spec中的任何內容來表明這實際上是HTTP協議違規。考慮這個挑戰。