HttpWebResponse GetResponseStream висит в Dispose

#c# #httpwebrequest

#c# #httpwebrequest

Вопрос:

Я использую HttpWebResponse.GetResponseStream для доступа к потоку интернет-радио и хочу прочитать некоторые данные из потока ответов, а затем отключиться. Тем не менее, я всегда зависаю на неопределенный срок при удалении потока. Приведенный ниже модульный тест отобразит «Очистка сетевого потока …», но никогда не перейдет к «Завершено». Почему это? И должен ли я исправить это, просто не утруждая себя удалением моего 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. У меня такая же проблема. Я знаю, что вы исправили это с помощью req.Abort(); но мне интересно, почему код зависает при удалении потока ответов в первую очередь.

Ответ №1:

РЕДАКТИРОВАТЬ: только что найдено решение… вызовите 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 .

Комментарии:

1. Этот тоже зависает — я не добираюсь до «Готово»

2. Только что попробовал, я получаю тот же результат по этому URL … странно

3. спасибо, это помогает — вы хотите отредактировать это в своем примере кода, и я отмечу как ответ