簡體   English   中英

如何在C#中按段下載文件?

[英]How do I download a file in segments in C#?

我正在將HttpWebRequest與AddRange函數一起使用:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
myHttpWebRequest.AddRange(20, 30);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Stream streamResponse = myHttpWebResponse.GetResponseStream();
SaveFileStream(name, streamResponse); //save file function

...但是下載了整個文件。

上面的代碼中的AddRange()期望下載20到30之間的字節(換句話說,從文件中下載這10個字節)。

但是我的代碼無法正常工作,因為下載沒有分段。 該鏈接提供了一個示例: http : //stackoverflow.com/robots.txt該文件是完整下載的。 為什么?

不需要HTTP服務器來支持Range標頭請求。 您可以通過發出HEAD請求並檢查響應中的Accept-Ranges標頭的值來驗證服務器的范圍支持(請參閱HTTP范圍請求 )。 但這仍然不能保證服務器不會忽略Range標頭,尤其是對於很小的范圍(HTTP服務器在如此小的段中提供內容的效率非常低)。

RFC7233

由於服務器可以隨意忽略Range,因此許多實現都將簡單地以200(OK)響應來響應整個選定的表示形式。 這部分是因為大多數客戶端准備好接收200(確定)以完成任務(盡管效率較低),部分原因是客戶端在收到完整的表示之前可能不會停止發出無效的部分請求。 因此,即使最合適,客戶端也不能依賴於接收到416(不滿足范圍)響應。

若要確定服務器是接受還是忽略Range標頭,必須檢查響應狀態代碼。 200 (OK)表示服務器忽略了Range標頭並返回了整個響應正文, 206 (Partial Content)指示標頭中指定的范圍由服務器返回,而416 (Range Not Satisfiable)指示所請求的范圍集已由於以下原因而被拒絕無效范圍或對較小或重疊范圍的過多請求。

http://stackoverflow.com/robots.txt的情況下,服務器通過響應HEAD請求,但在指定了AddRange(20,30)的GET請求中,通過返回Accept-Ranges: bytes標頭來指示對Range標頭的支持200 (OK) ,因此服務器只是忽略了這么小的范圍而返回了整個響應正文。 如果需要,您必須自己減少響應范圍。

暫無
暫無

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

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