HttpWebResponse GetResponseStream hangs in Dispose

I use HttpWebResponse.GetResponseStreamInternet radio to access the stream and I want to read some data from the response stream and then disconnect. However, I always hang endlessly on Dispose of the stream. unit test below will show "Cleaning the network stream ...", but never go to "Finished". Why is this? And should I fix it just by not worrying about recycling my network stream?

[Test]
public void CanStreamMP3Radio()
{
    string url = @"http://radio.reaper.fm/stream/";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

    int total = 0;
    byte[] buffer = new byte[1024];

    using(var networkStream = resp.GetResponseStream())
    {
        do
        {
            int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("{0} bytesRead", bytesRead);
            total += bytesRead;
        } while (total < 16384);
        Console.WriteLine("Cleaning up networkStream...");
    }
    Console.WriteLine("Finished");
}
+3
source share
1 answer

EDIT: just found a solution ... call req.Abort()to the end of the block using. Not very elegant, but it works ... So, the code becomes:

[Test]
public void CanStreamMP3Radio()
{
    string url = @"http://radio.reaper.fm/stream/";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
    {
        int total = 0;
        byte[] buffer = new byte[1024];

        var networkStream = resp.GetResponseStream();
        do
        {
            int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("{0} bytesRead", bytesRead);
            total += bytesRead;
        } while (total < 16384);
        Console.WriteLine("Cleaning up HttpWebResponse...");
        req.Abort();
    }
    Console.WriteLine("Finished");
}

Try using HttpWebResponseinstead:

[Test]
public void CanStreamMP3Radio()
{
    string url = @"http://radio.reaper.fm/stream/";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
    {
        int total = 0;
        byte[] buffer = new byte[1024];

        var networkStream = resp.GetResponseStream();
        do
        {
            int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("{0} bytesRead", bytesRead);
            total += bytesRead;
        } while (total < 16384);
        Console.WriteLine("Cleaning up HttpWebResponse...");
    }
    Console.WriteLine("Finished");
}

NetworkStream.

+3

All Articles