代码之家  ›  专栏  ›  技术社区  ›  Jiew Meng

如何知道响应的长度(HttpWebRequest.GetResponse().GetResponseStream())

  •  6
  • Jiew Meng  · 技术社区  · 14 年前

    我可以知道响应流的长度,这样我就可以向用户显示下载进度的百分比,而不是不确定的进度?

    我发现反应如下,不可见,没有长度

    3 回复  |  直到 14 年前
        1
  •  13
  •   cdhowie    10 年前

    尝试使用 WebResponse.ContentLength 财产。如果返回-1,则意味着远程服务器没有向您发送响应正文的长度,因此,如果不完整地读取响应,则无法确定响应的长度。

        2
  •  1
  •   skolima    14 年前

    如果您感兴趣,我有一个代码引用库,其中包括一个WebHelper类。它类似于类(包括报告进度的能力),但更灵活。它存储在CodePlex上,项目名为 BizArk .

    它使用Response.ContentLength属性来确定响应的长度。

    ContentLength属性只是作为头的一部分从服务器发送的。在某些情况下,服务器可能在发送头之前不知道响应的长度。例如,如果正在下载动态生成的网页,而服务器上的缓冲区已关闭。

        3
  •  -3
  •   Paolo Sanchi    12 年前

    我解决了创建名为WebStreamWithLenght的包装类的问题(seek方法没有实现,因为我不需要它)

    你应该这样用

    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);
            }
        }