簡體   English   中英

如何知道Response的長度(HttpWebRequest.GetResponse()。GetResponseStream())

[英]How to know the length of Response (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);
        }
    }

暫無
暫無

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

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