HttpWebResponse GetResponseStream висит в Dispose - PullRequest
3 голосов
/ 02 мая 2011

Я использую HttpWebResponse.GetResponseStream для доступа к потоку интернет-радио, и хочу прочитать некоторые данные из потока ответа, а затем отключиться. Тем не менее, я всегда зависаю на неопределенный срок. В приведенном ниже модульном тесте будет отображаться «Очистка networkStream ...», но никогда не будет показано «Завершено». Почему это? И нужно ли это исправить, просто не удосужившись избавиться от моего networkStream?

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

1 Ответ

3 голосов
/ 02 мая 2011

РЕДАКТИРОВАТЬ: только что найдено решение ... вызов req.Abort() до конца блока using. Не очень элегантно, но работает ... Так код становится:

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

Попробуйте вместо HttpWebResponse указать:

[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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...