2010-11-22 128 views

回答

13

嘗試使用WebResponse.ContentLength財產。如果返回-1,則表示遠程服務器沒有向您發送響應正文的長度,因此如果不全面讀取響應,則無法確定響應的長度。

+0

我在PHP哪裏做了一個測試我設置了內容長度([pastebin上的代碼](http://pastebin.com/CX7imFKr)),不知道我是否做得對,而且我仍然有一個不可檢索的流...嗯...我會嘗試一個真正的下載,也許從download.com以後... – 2010-11-22 05:06:20

+2

流'WebResponse.GetResponseStream'是不可搜索的。這是一個只向前流的只讀流。但ContentLength頭部如果設置通常是可靠的。你不應該尋求。 – 2010-11-22 05:20:27

1

如果您有興趣,我有一個包含WebHelper類的代碼參考庫。它類似於WebClient類(包括報告進度的能力),但更加靈活。它存儲在CodePlex上,項目名稱爲BizArk

它使用Response.ContentLength屬性來確定響應的長度。

ContentLength屬性只是作爲服務器頭部分的一部分發送。在發送標題之前,服務器可能不知道響應的長度。例如,如果您正在服務器上關閉緩衝,則下載動態生成的網頁。

-3

我解決創建一個名爲WebStreamWithLenght包裹類(尋求方法未實現,因爲我並不需要它)

你應該使用這樣

WebRequest req = HttpWebRequest.Create(link); 
WebResponse res = req.GetResponse(); 
var stream = res.GetResponseStream(); 
var streamWithLenght = new WebStreamWithLenght(stream, res.ContentLength); 

    public class WebStreamWithLenght : Stream 
    { 
     long _Lenght; 
     Stream _Stream; 
     long _Position; 

     public WebStreamWithLenght(Stream stream, long lenght) 
     { 
      _Stream = stream; 
      _Lenght = lenght; 
     } 

     public override bool CanRead 
     { 
      get { return _Stream.CanRead; } 
     } 

     public override bool CanSeek 
     { 
      get { return true; } 
     } 

     public override bool CanWrite 
     { 
      get { return _Stream.CanWrite; } 
     } 

     public override void Flush() 
     { 
      _Stream.Flush(); 
     } 

     public override long Length 
     { 
      get { return _Lenght; } 
     } 

     public override long Position { get; set; } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      var result = _Stream.Read(buffer, offset, count); 
      Position += count; 
      return result; 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void SetLength(long value) 
     { 
      _Lenght = value; 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Write(buffer, offset, count); 
     } 
    } 
+0

爲什麼downvotes?有沒有人想解釋爲什麼這不是一個好的答案? – setholopolus 2017-11-16 18:23:50

相關問題