Прогрессивная загрузка веб-клиента Silverlight
Я пытаюсь постепенно загрузить массив сериализованных данных. Цель состоит в том, чтобы отправить один большой блок с сервера и частично обработать его на клиенте во время загрузки.
Я использую класс 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 ответа
Не используйте для этого WebClient, а скорее сокеты (если это возможно.)
У Майка Шварца есть отличный клиент для сокетов, который вы можете использовать
http://weblogs.asp.net/mschwarz/archive/2008/03/07/silverlight-2-and-sockets.aspx
Вы используете IE и загружаете менее 4 КБ данных? IE не предоставит вам данные, пока у вас не будет больше 4 КБ. После 4 КБ у вас есть все детали, которые вам нужны. Возможные решения:
- Отправить данные мусора, чтобы получить до 4 КБ
- Если вы знаете, что запрос будет небольшим, присвойте AllowReadStreamBuffering значение true.