簡體   English   中英

HttpWebResponse.GetResponseStream():什么時候傳輸響應體?

[英]HttpWebResponse.GetResponseStream(): when is the response body transmitted?

我正在使用System.Net.HttpWebRequest class 來實現一個簡單的 HTTP 下載器,它可以在取消后暫停、取消甚至恢復(使用 Z293C9EA246FF9985DC6F62A650F7898Z 范圍請求標頭)。

很明顯 HttpWebRequest.GetResponse() 是在 HTTP 請求實際發送到服務器時,該方法在收到 HTTP 響應時返回(或發生超時)。 但是,響應正文用 Stream 表示,這讓我想知道響應正文是否實際上是與響應 header 一起傳輸的(即它在 GetResponse() 返回時已經下載),或者它只是在我嘗試時按需下載從響應 stream 中讀取? 或者當我調用 HttpWebResponse.GetResponseStream() 方法時?

不幸的是,msdn 文檔沒有說明,而且我對 HTTP 協議的了解還不夠,無法說明。

在這種情況下,分塊傳輸等行為如何(也就是說,我應該如何在我的 C# 應用程序中處理它們)? 實際上什么時候從服務器下載響應數據?

這一切都依賴於HTTP的底層協議TCP。 TCP 的工作方式是分段發送數據。 每當客戶端向服務器發送段時,發送的數據中都會包含有關它准備接收多少附加數據的信息。 這通常對應於客戶端的某種緩沖區。 當客戶端接收到一些數據時,它也會向服務器發送一個段,確認接收到的數據。

因此,假設客戶端在處理接收到的數據時非常慢,事件序列可以像這樣 go :

  1. 連接建立,客戶端說它准備接收多少數據。
  2. 服務器向客戶端發送一個或多個段,其中的總數據最多為客戶端表示准備接收的數量
  3. 客戶端對服務器說:我收到了你發給我的數據,但現在不要再發給我了。
  4. 客戶端處理一些數據。
  5. 客戶端對服務器說:你可以給我發送 x 更多字節的數據

這對GetResponse()意味着什么? 當您調用GetResponse()時,客戶端發送請求,讀取響應的 HTTP header (通常適合一個段,但可能更多)並返回。 此時,如果您不開始讀取響應 stream(您通過調用GetResponseStream()獲得),則會收到來自服務器的一些數據,但僅用於填充緩沖區。 當它已滿時,在您開始讀取響應 stream 之前不會再傳輸數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM