Следующий код получает поток из URI и будет считываться в кусках с использованием цикла. Обратите внимание, что за указанным URI используется онлайн-радиопоток, что означает, что неизвестного размера нет.
var uri = new Uri("http://*******", UriKind.Absolute);
var http = new HttpClient();
var stream = await http.GetStreamAsync(uri);
var buffer = new byte[65536];
while (true)
{
var read = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
Debug.WriteLine("Read: {0}", read);
}
Теперь, когда это прекрасно работает в консольном приложении.NET 4.5, этот точно такой же код не работает так, как ожидалось в WinRT, - он будет читать первый фрагмент, а при вызове ReadAsync во второй раз он просто застрянет и никогда не продолжит,
Если я переключу URI на файл (известного размера), все будет хорошо работать в обоих проектах.
Какие-нибудь советы?
EDIT > обратите внимание, что это поведение происходит только на WP8.1. Я просто искал еще что-то в SO и обнаружил, что мой вопрос может быть дубликатом этого: WP8.1 HttpClient Stream получил только 65536 байт данных. Если это правда, я закрою свой вопрос
Используйте HttpClient.GetAsync()
с HttpCompletionOption.ResponseHeadersRead
. Это возвращается при получении заголовков, затем выполняется HttpResponse.Content.ReadAsInputStreamAsync()
.
Windows.Web.Http
вместо System.Net.Http
. Проверьте этот пример: monkeyweekend.wordpress.com/2015/01/11/…
Похоже, ваш цикл while бесконечен. Как вы гарантируете, что это конечно? Вместо while (true) сделайте что-то вроде этого
var uri = new Uri("http://*******", UriKind.Absolute);
var http = new HttpClient();
var stream = http.GetStreamAsync(uri).Result;
using (var reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
var response = reader.ReadToEnd();
}
}