#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. спасибо, это помогает — вы хотите отредактировать это в своем примере кода, и я отмечу как ответ