Прогрессивная загрузка веб-клиента Silverlight - PullRequest
3 голосов
/ 11 июня 2009

Я пытаюсь постепенно загрузить массив сериализованных данных. Цель состоит в том, чтобы отправить один большой блок с сервера и частично обработать его на клиенте во время загрузки.

Я использую класс System.Net.WebClient и устанавливаю для его свойства AllowReadStreamBuffering значение false. Согласно документации MSDN, это должно позволить мне получить доступ к входящему потоку из события OpenReadCompleted.

Однако, когда я пытаюсь получить доступ к потоку, он генерирует исключение NotSupportedException. Это не проблема междоменной политики, и если я устанавливаю для свойства AllowReadStreamBuffering значение true, он загружается и прекрасно читает содержимое. Я что-то пропустил? Как мне выполнять прогрессивную загрузку с Silverlight?

Минимальный код для репликации этой проблемы:

    private void BeginProgressiveDownload()
    {
        WebClient client = new WebClient();
        client.AllowReadStreamBuffering = false;
        client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        client.OpenReadAsync(new Uri("http://STREAMABLE RESOURCE HERE"));
    }

    void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        e.Result.ReadByte();
    }

Ответы [ 2 ]

0 голосов
/ 12 июня 2009

Не используйте для этого WebClient, а скорее сокеты (если это возможно.)

У Майка Шварца есть отличный клиент для сокетов, который вы можете использовать

http://weblogs.asp.net/mschwarz/archive/2008/03/07/silverlight-2-and-sockets.aspx

0 голосов
/ 11 июня 2009

Вы используете IE и загружаете данных размером менее 4 КБ ? IE не предоставит вам данные, пока у вас не будет больше 4 КБ. После 4 КБ у вас есть все детали, которые вам нужны. Возможные решения:

  • Отправка данных мусора для получения до 4 КБ
  • Если вы знаете, что запрос будет небольшим, задайте для параметра AllowReadStreamBuffering значение true.
...