2010-08-10 88 views
1

我在.net和POST數據中使用WebRequest類到正在響應響應的服務器。WebRequest問題,請求主體之前的響應

奇怪的是,當我開始小提琴手分析我的網絡流量時,它的工作,但沒有小提琴手它不是。

因此,我開始分析使用WireShark發送到計算機和從計算機發送的包。在這個程序中,它很容易遵循TCP流。所以當我開着小提琴時,我可以看到發送了正確的Request-header/body,並獲得Response-header/body。奇怪的部分是當我不使用fiddler發送Request-header時,那麼我得到了Response-header/body,最後是TCP-stream結尾的request-body。

這裏是我的代碼,我已經闡述:

string lcUrl = "http://XX.XX.XXX.XX"; 

     // *** Establish the request 

     HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 

     string lcPostData = testdata; 

     loHttp.Method = "POST"; 

     byte [] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData); 

     loHttp.ContentLength = lbPostBuffer.Length; 

     loHttp.Credentials = CredentialCache.DefaultCredentials; 

     //loHttp.SendChunked = true; 

     loHttp.ServicePoint.Expect100Continue = false; 

     Stream loPostData = loHttp.GetRequestStream(); 

     loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length); 

     loPostData.Close(); 

     HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse(); 

     Encoding enc = System.Text.Encoding.GetEncoding(1252); 

     StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc); 

     string lcHtml = loResponseStream.ReadToEnd(); 

     loWebResponse.Close(); 

     loResponseStream.Close(); 
+0

也許這有助於:http://stackoverflow.com/questions/18126941/c-sharp-webrequest-post-and-getresponse – xameeramir 2014-05-07 14:59:52

回答

2

請使用下面的代碼。似乎您在將基礎流發送到遠程服務器時遇到問題。

string lcUrl = "http://XX.XX.XXX.XX"; 
// *** Establish the request 
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 
string lcPostData = testdata; 
loHttp.Method = "POST"; 
byte[] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData); 
loHttp.ContentLength = lbPostBuffer.Length; 
loHttp.Credentials = CredentialCache.DefaultCredentials; 
//loHttp.SendChunked = true; 
loHttp.ServicePoint.Expect100Continue = false; 
using (Stream loPostData = loHttp.GetRequestStream()) 
{ 
    loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length); 
} 
string lcHtml; 
using (HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse()) 
{ 
    Encoding enc = System.Text.Encoding.GetEncoding(1252); 
    using (StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc)) 
    { 
     lcHtml = loResponseStream.ReadToEnd(); 
    }    
} 
// Perform processing of data here.... 

另外我可以建議你在你的應用程序的app.config文件中添加下面的代碼。這是在服務器返回不符合.NET處理HTTP請求的方式的響應時的幫助。

<configuration> 
<system.net> 
<settings> 
<httpWebRequest 
useUnsafeHeaderParsing="true" 
/> 
</settings> 
</system.net> 
</configuration> 
+0

對不起,但它沒有太大的幫助,我得到了相同的結果如前...嵌套請求/響應 – Claysson 2010-08-10 17:35:24

0

我懷疑客戶端正在等待來自服務器的「HTTP/1.1 100 continue」響應。這是它的工作原理。將數據發佈到服務器時,有時服務器可能尚未準備好接受數據。例如,它想要首先認證客戶端。

所以,當你發送一個POST請求時,客戶端只是發送請求標題,附加一個「Expect:100-continue」。

POST/URL HTTP/1.1 服務器:服務器名稱/ FQDN 的Content-Length:100 期望:100繼續

如果服務器準備好接受它與迴應中的數據:

HTTP/1.1 100繼續 服務器:服務器名稱/ fqdn

現在,客戶端可以發送數據。

但是,如果服務器沒有準備好接收數據,並且想要驗證客戶端,它將使用不同的狀態碼進行響應。

如果您發佈wireshark跟蹤到pastebin.com我可以驗證,但我懷疑這是發生了什麼。

你不在小提琴手看到這個的原因可能是小提琴手正在使用HttpListener來監聽HTTP請求,並且HTTP監聽器從應用程序(在本例中爲fiddler)隱藏了像100-continue這樣的中間響應。

+0

我不確定跟蹤是什麼?我如何從WireShark獲得這個? – Claysson 2010-08-11 06:59:57

+0

只需點擊「跟蹤tcp流」,就像你之前做過的一樣。然後將其複製/粘貼到文本文件中並將內容放在pastebin上。com – feroze 2010-08-12 20:25:31

+0

問題解決了,問題發現在服務器上,我不知道他們有什麼樣的問題。 feroze,感謝您抽出時間! – Claysson 2010-08-13 20:50:34

相關問題