2

我正在尝试HttpWebRequest在 Windows Phone 8.1 运行时使用(可以是任何不同的方式 - 我尝试过 WebRequest、HttpClient ...)从 websource 下载一些字节 - 完整代码:

private async void Download1000_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("Download Started");
    HttpWebRequest longRequest = (HttpWebRequest)WebRequest.Create(new Uri(@"http://s3.amazonaws.com/dnr/dotnetrocks_0986_enterprise_sharepoint.mp3"));
    longRequest.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString(); // prevent caching the whole file
    longRequest.AllowReadStreamBuffering = false;
    using (WebResponse myResponse = await longRequest.GetResponseAsync())
    using (Stream myStream = myResponse.GetResponseStream())
    {
        int bytesRead = 0;
        byte[] myBuffer = new byte[1000];
        Stopwatch newWatch = new Stopwatch();
        newWatch.Start();
        while ((bytesRead = await myStream.ReadAsync(myBuffer, 0, 1000)) > 0)
            Debug.WriteLine(bytesRead.ToString() + " bytes read. Elapsed time: " + newWatch.Elapsed.TotalSeconds.ToString("0.000000") + " seconds");
    }
    Debug.WriteLine("Download Finished");
}

问题- 代码正在运行,但操作系统以某种方式阻止读取少量字节(即使我已经禁用AllowReadStreamBuffering) - 似乎它将整个文件下载到某个缓存(?),然后运行while loop​​. 它看起来像这样:

withSomeCache

如您所见 - 第一个字节数在 22 秒后出现 - 文件被整个下载。相反,当我在 Windows Phone 8.1 Silverligh 上构建相同的代码(复制粘贴)并在同一设备上运行时 - 它按应有的方式运行:

没有缓存

有什么方法可以在 WP8.1 Runtime 上下载字节数,而无需先下载整个文件?

4

2 回答 2

1

这是最后的想法 - 使用套接字!这很不酷,我知道。

如果您需要的不是超级复杂,您可以使用这两个混合起来:.NET Http 套接字库用于 WP 的 TcpClient。我最近需要将它用于 Windows Phone 8.0 应用程序,所以我使用了这些库,它运行良好。

编辑 - 演示项目

这是一个演示项目,可以执行我刚才的建议。这不是史诗,但它似乎可以解决问题。如果您不需要太复杂的东西,它应该可以正常工作。

Offtopic - 为什么我需要套接字

最近,我对 http 请求的所有其他可用选项都遇到了问题——它们都需要 UI 线程是空闲的才能工作(至少在 Windows Phone 中,不确定 WinRT)。也就是说 - 即使您从另一个线程使用它们,它们实际上也会在 UI 线程中执行某些操作。这通常很好......除了在我的情况下,我真的需要阻止 UI 线程。

于 2014-05-23T12:42:44.160 回答
1

这是SDK中的一个错误。通过电子邮件向 Microsoft 团队报告,并得到了他们的一位工程师的确认。希望下个版本能修复...

于 2014-05-31T18:42:33.267 回答