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

In the below sample code, streamSupportsReading is 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;
}


Solution 1:[1]

It's because you put response.GetResponseStream() in a using block, so it gets disposed before GetFile() returns, making it unusable.

If you were to not dispose it, then CanRead would still be true:

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Gabriel Luci