Почему WebClient.OpenReadAsync возвращает e.Result нулевой длины, если загрузка прошла успешно? - PullRequest
2 голосов
/ 06 октября 2010

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

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

Работает с небольшими файлами (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 />
}

Есть идеи?

Ответы [ 3 ]

1 голос
/ 06 октября 2010

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

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

<system.web>
    ... 
   <httpRuntime maxRequestLength="xxx" /> // Size in Kb
</system.web>
1 голос
/ 07 октября 2010

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

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

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

1 голос
/ 06 октября 2010

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

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

Поэтому я бы проигнорировал Length, проверьтеэти поля, а затем прочитайте, сколько душе угодно.

...