简体   繁体   English

为什么 Stream.CanRead 在 HttpWebResponse object 上第二次调用 GetResponseStream() 时返回 false

[英]Why does Stream.CanRead return false when calling GetResponseStream() second time on HttpWebResponse object

In the below sample code, streamSupportsReading is false.在下面的示例代码中, streamSupportsReading为 false。

private void SomeFunction()
{
    HttpWebResponse responseObj = GetFile();
    bool streamSupportsReading = responseObj.GetResponseStream().CanRead;
}

private HttpWebResponse GetFile()
{
    var request = (HttpWebRequest)HttpWebRequest.Create("URL");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (var stream = response.GetResponseStream())
    {
        using (var bytes = new MemoryStream())
        {
            var buffer = new byte[256];
            while (bytes.Length < response.ContentLength)
            {
                var read = stream.Read(buffer, 0, buffer.Length);
                //code to calculate download percentage
            }
        }
    }
    return response;
}

It's because you put response.GetResponseStream() in a using block, so it gets disposed before GetFile() returns, making it unusable.这是因为您将response.GetResponseStream()放在using块中,因此它在GetFile()返回之前被处置,使其无法使用。

If you were to not dispose it, then CanRead would still be true:如果您不处理它,那么CanRead仍然是正确的:

private HttpWebResponse GetFile()
{
    var request = (HttpWebRequest)HttpWebRequest.Create("URL");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
    var stream = response.GetResponseStream();
    
    using (var bytes = new MemoryStream())
    {
        var buffer = new byte[256];
        while (bytes.Length < response.ContentLength)
        {
            var read = stream.Read(buffer, 0, buffer.Length);
            //code to calculate download percentage
        }
    }
    return response;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法将HttpWebResponse.GetResponseStream()分配给Stream - Unable to assign HttpWebResponse.GetResponseStream() to Stream HttpWebResponse.GetResponseStream():什么时候传输响应体? - HttpWebResponse.GetResponseStream(): when is the response body transmitted? 使用HttpWebResponse :: GetResponseStream方法时接收不完整的数据 - Receiving incomplete data when using HttpWebResponse::GetResponseStream method 为什么HttpWebResponse返回空终止的字符串? - Why does HttpWebResponse return a null terminated string? HttpWebResponse GetResponseStream 挂在 Dispose - HttpWebResponse GetResponseStream hanging in Dispose 为什么CanRead和CanWrite在C#中为具有重写访问器的属性返回false? - Why do CanRead and CanWrite return false in C# for properties with overridden accessors? 当Content-Encoding为空时,为什么HttpWebResponse尝试使用GZip对流进行解压缩? - Why does HttpWebResponse try to decompress the stream using GZip when Content-Encoding is empty? 流CanRead / CanSeek否+长度和位置抛出异常NotSupportedException - Stream CanRead/CanSeek false + Length&Position threw exception NotSupportedException 调用Dispose()后,为什么IsDisposed返回false? - Why does IsDisposed return false after calling Dispose()? 为什么Object.Equals()在从不同的程序集中实例化时,对于相同的匿名类型返回false? - Why does Object.Equals() return false for identical anonymous types when they're instantiated from different assemblies?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM