2012-07-25 193 views
0

我練HTTP在C#中使用套接字,我能與此代碼來獲取響應正文:HTTP套接字:響應頭

int bytes = 0; 
while (bytes > 0) 
{ 
    bytes = HttpSocket.Receive(RecieveBytes, RecieveBytes.Length, 0); 
    Response.Body = Response.Body + Encoding.ASCII.GetString(RecieveBytes, 0, bytes); 
} 

當我讀到Response.Body只包含HTML代碼。 (身體)。

我如何獲得更多信息?像迴應標題?我已經做了一些谷歌搜索,但沒有明確的答案。

注意:我知道在C#中沒有爲int創建類或框架的要點,因爲我們有HttpWebRequest。不過,我正在爲此進行學習。

斯文

+0

這裏沒有「原始插座」。你在上面有幾層。 – EJP 2012-07-26 02:14:23

回答

2

這不可能是真的,你只收到HTTP響應主體,Socket.Receive()將接收服務器發送所有可用的字節,所以響應頭必須有太多(如果你是與一個普通的Web服務器通話併發出有效的請求)。使用像Fiddler這樣的工具來監控請求 - 響應對,並檢查響應是否以HTTP/1.1 200 OK開頭。

您可以撥打Receive(),直到您收到一個雙重\r\n,表示所有標題已發送。從那裏開始,您必須執行RFC 2616 section 4.4以確定要讀取多少(如果有)消息正文數據。

最常見的是一個Content-length響應標題,它表示在雙\r\n之後應該讀取多少字節。如果該標題不存在(或者如果您的請求方法爲HEAD,在這種情況下,您應該停止閱讀,因爲不會有消息正文),並且其他message length cases都不適用,那麼您在此時正在讀取數據你不應該嘗試Receive()更多的數據。

但是,如果是爲了學習的目的,你應該已經找到了RFC並且實現了它。你不能只是閱讀數據,希望它能正常工作,這就是協議的用途。

+0

所以我應該只是將'字節'轉換爲字符串,然後HTTP響應頭應該在那裏? – 2012-07-25 15:03:56

+0

@SwenKooij,這是正確的。 – CodeCaster 2012-07-25 15:04:30

+0

'Content-Length'標題不是檢測消息結束的唯一方法。 HTTP定義了幾種不同的方式來做到這一點,而不是所有的都是基於頭的。閱讀RFC 2616第4.4節的具體內容。 – 2012-07-26 03:45:24

0

您的while循環將永遠不會執行,因爲'字節'最初爲零,並且它只在循環爲正時。

0

這不是處理HTTP的最佳方法。 Socket類對原始字節進行操作,但HTTP標頭對文本行進行操作。您需要在循環中讀取文本行,直到遇到空行,然後處理標題以決定如何完成讀取剩餘的原始字節(如果有)。看看這個NetworkStreamStreamReader類。更好的選擇是使用HttpClient客戶端類,讓它爲您處理所有這些細節。