Сбои WebClient и HttpWebRequest при загрузке большого файла в Windows Phone 7 - PullRequest
1 голос
/ 30 апреля 2011

Я пробовал и WebClient, и HttpWebRequest, чтобы загрузить файл размером 381 МБ через соединение Wi-Fi или привязанный. Он продолжал сбои (без ошибок и исключений). Он работает с файлом размером 194 МБ. Есть ли способ скачать большие файлы? или Есть ли ограничение размера файла для загрузки на Windows Phone 7? Благодарю.

Для запроса HttpWebRequest: Request.BeginGetResponse () никогда не перезванивает; Для WebClient: DownloadProgressChanged хорошо реагирует, но он падает до OpenReadCompleted. Тот же код работает нормально, когда файл меньше, например, 194 МБ.

Вот код для WebClient:

   WebClient wc = new WebClient();
   wc.DownloadProgressChanged += ((s, e) =>
   {
       UpdateProgress(e.BytesReceived, e.TotalBytesToReceive);
   });

   wc.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
   {
       if (e.Error == null)
       {
           using (var storeIso = IsolatedStorageFile.GetUserStoreForApplication())
           {
               if (e.Result.Length < storeIso.AvailableFreeSpace)
               {
                   if (storeIso.FileExists(LocalFilePath))
                      storeIso.DeleteFile(LocalFilePath);

                   using (var fs = 
                          new IsolatedStorageFileStream(LocalFilePath,
                          FileMode.Create, storeIso))
                   {
                      int bytesRead;
                      byte[] bytes = new byte[1024 * 1024 * 1]; // 1meg
                      while ((bytesRead = 
                         ResponseStream.Read(bytes, 0, bytes.Length)) != 0)
                      {
                        fs.Write(bytes, 0, bytesRead);
                      }
                      fs.Flush();
                    }
               }
           }
       }
   };

   wc.OpenReadAsync(
    new System.Uri(DownloadFilePath, System.UriKind.RelativeOrAbsolute));

Где UpdateProgress для расчета процента. Когда я попробовал файл размером 381 МБ, приложение вылетает до вызова OpenReadCompleted. Аналогично, когда я попробовал HttpWebRequest, обратный вызов, назначенный для Request.BeginGetResponse (), не вызывается для файла размером 381 МБ.

Для файлов меньшего размера он отлично работает либо с WebClient, либо с HttpWebRequest. Мне кажется, есть ограничение «памяти» при передаче загруженного файла в приложение?

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Для больших файлов (по моим оценкам, более 3 МБ), обязательно установите HttpWebRequest.AllowReadStreamBuffering = false.Это приведет к перемещению данных.

0 голосов
/ 03 мая 2011

Да, существуют ограничения памяти на платформе. Вы контролируете это? (Подробнее об этом см. http://blogs.msdn.com/b/mikeormond/archive/2010/12/16/monitoring-memory-usage-on-windows-phone-7.aspx.)

Возможно, вы захотите использовать несколько запросов (с заголовком Range) для загрузки больших файлов. Помимо того, что вы избежите ограничений памяти, это также позволит вашим пользователям прекратить загрузку вашего приложения, а затем перезапустить его без необходимости перезапуска загрузки.
Я использовал эту технику для загрузки файлов до 2,5 ГБ на телефон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...