WinRT从无限的在线流中读取

时间:2015-01-11 01:38:49

标签: c# http windows-runtime windows-phone-8.1 async-await

以下代码从URI获取Stream,并使用循环以块的形式读入。请注意,指定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切换到一个文件(已知大小),一切都可以正常工作。

任何提示?

修改>请注意,此行为仅在WP8.1上发生。我刚刚在SO上搜索了一些内容,发现我的问题可能与此问题重复:WP8.1 HttpClient Stream got only 65536 bytes data如果确实如此,我将结束我的问题

2 个答案:

答案 0 :(得分:2)

HttpClient.GetAsync()HttpCompletionOption.ResponseHeadersRead一起使用。收到标题后返回,然后执行HttpResponse.Content.ReadAsInputStreamAsync()

答案 1 :(得分:-2)

看起来你的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();
     }
}