任何方式我都可以知道響應流的長度,因此我可以向用戶顯示下載的百分比進度而不是不確定的進度?如何知道響應的長度(HttpWebRequest.GetResponse()。GetResponseStream())
我發現響應看起來像下面的,非可搜索並沒有長
任何方式我都可以知道響應流的長度,因此我可以向用戶顯示下載的百分比進度而不是不確定的進度?如何知道響應的長度(HttpWebRequest.GetResponse()。GetResponseStream())
我發現響應看起來像下面的,非可搜索並沒有長
嘗試使用WebResponse.ContentLength
財產。如果返回-1,則表示遠程服務器沒有向您發送響應正文的長度,因此如果不全面讀取響應,則無法確定響應的長度。
如果您有興趣,我有一個包含WebHelper類的代碼參考庫。它類似於WebClient類(包括報告進度的能力),但更加靈活。它存儲在CodePlex上,項目名稱爲BizArk。
它使用Response.ContentLength屬性來確定響應的長度。
ContentLength屬性只是作爲服務器頭部分的一部分發送。在發送標題之前,服務器可能不知道響應的長度。例如,如果您正在服務器上關閉緩衝,則下載動態生成的網頁。
我解決創建一個名爲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);
}
}
爲什麼downvotes?有沒有人想解釋爲什麼這不是一個好的答案? – setholopolus 2017-11-16 18:23:50
我在PHP哪裏做了一個測試我設置了內容長度([pastebin上的代碼](http://pastebin.com/CX7imFKr)),不知道我是否做得對,而且我仍然有一個不可檢索的流...嗯...我會嘗試一個真正的下載,也許從download.com以後... – 2010-11-22 05:06:20
流'WebResponse.GetResponseStream'是不可搜索的。這是一個只向前流的只讀流。但ContentLength頭部如果設置通常是可靠的。你不應該尋求。 – 2010-11-22 05:20:27