2

Используя следующий код (из приложения OLE Silverlight 4 OOB), я получаю поток результатов с нулевым размером, хотя требуется время для загрузки всего файла (900 + МБ), и об ошибке не сообщается. Fiddler также говорит, что весь файл был загружен.Почему WebClient.OpenReadAsync возвращает e.Получение нулевой длины, если загрузка прошла успешно?

Удаленный обработчик прогресса (хотя и не показан ниже) получает сообщение об увеличении процента загрузки.

Работает с меньшими файлами (10 МБ).

var wc = new WebClient(); 
wc.OpenReadCompleted += DownloadWholeFileOpenReadCompleted; 
wc.DownloadProgressChanged += DownloadWholeFileDownloadProgressChanged; 

wc.OpenReadAsync(new Uri(movie.DownloadUrl, UriKind.Absolute)); 


private static void DownloadWholeFileOpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    if (e.Cancelled) 
    { 
     return; // this is not hit 
    } 

    if (e.Error != null) 
    { 
     return; // this is not hit 
    } 

    using (var fs = new FileStream(tempFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 
    { 
     var buffer = new byte[4096]; 
     int bytesRead; 

     // <snip /> 

     // e.Result.Length this equals 0 

     while ((bytesRead = e.Result.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      fs.Write(buffer, 0, bytesRead); 
     } 

     fs.Close(); 
    } 

    // <snip /> 
} 

Любые идеи?

ответ

1

По-видимому, существует "известная проблема" с использованием WebClient и очень больших файлов. В некоторых случаях это может быть связано с проблемами с Content-Length, которые не устанавливаются сервером.

Основываясь на данных, полученных с помощью Fiddler2, заголовок устанавливается правильно.
Поэтому я предполагаю, что это не является причиной моей конкретной проблемы.

По-видимому, эта проблема не существует с HttpWebRequest, поэтому я буду смотреть на изменение, чтобы использовать это вместо этого.

+0

Где описывается проблема? –

+0

@SB на данный момент только по электронной почте от кого-то из Microsoft. Я спросил, где/если это задокументировано, но еще не получено ответа. –

1

Мое предположение заключается в том, что базовый поток является ответным ответом, а в HTTP-ответе не указан заголовок длины контента. Так Length возвращает 0. Нет ничего об использовании Length в class spec. Согласно спецификации:

Вы должны проверить ошибки и Отменено свойства перед использованием данных , возвращаемые этой собственности. Если значение свойства свойства Error является объектом Exception или значение Отменено свойство true, асинхронная операция не выполнена и значение свойства недействительно.

Таким образом, я бы проигнорировал длину, проверил эти поля, а затем прочитал содержание вашего сердца.

+0

Как и в примере кода, я проверяю отмену и ошибку, но они не указывают на проблему. –

+0

Итак, вы должны хорошо читать из потока. Дело в том, что вы не можете рассчитывать на длину, к сожалению. Ответы HTTP не требуются, чтобы поместить это в заголовки, и я полагаю, что вы найдете в любое время, когда у вас есть допустимое поле Length (например, с файлами 10MB), в котором присутствует заголовок Content-Length. –

1

Существует ограничение по умолчанию для 4Mb для загрузки данных. Вы увеличили его?

Попробуйте эту ссылку: http://forums.silverlight.net/forums/p/21513/75649.aspx

<system.web> 
    ... 
    <httpRuntime maxRequestLength="xxx" /> // Size in Kb 
</system.web> 
+0

Я не загружаю, я загружаю, и он справляется с штрафом 10 МБ, так что это определенно не он. –

+0

@Matt Lacey: Я имел в виду загрузку * исправлено сейчас * :) При каком размере * делает * это терпит неудачу? Это само по себе может дать вам ключ. –

Смежные вопросы