从websource下载字节数

时间:2014-05-23 05:48:11

标签: c# windows-runtime windows-phone-8.1 win-universal-app

我试图在Windows Phone 8.1 Runtime上使用HttpWebRequest从webource下载一些字节(可以是任何不同的方式 - 我已尝试过WebRequest,HttpClient ...) - 完成代码:

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上创建相同的代码(复制粘贴)并在同一设备上运行时 - 它应该按原样运行:

withoutCache

是否有任何方法可以在WP8.1运行时下载字节数,而无需先下载整个文件?

2 个答案:

答案 0 :(得分:1)

这是一个不得已的想法 - 使用套接字!我知道,它非常不酷。

如果你需要的东西不是非常复杂,你可以使用这两个来混合:.NET Http socket libraryTcpClient for WP。我最近需要这个用于Windows Phone 8.0的应用程序,所以我使用这些库并且它工作正常。

编辑 - 演示项目

这里的demo project符合我的建议。它没什么史诗般的,但它似乎可以解决问题。如果你不需要太复杂的东西,它应该可以正常工作。

Offtopic - 为什么我需要套接字

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

答案 1 :(得分:1)

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