Управление доставкой динамического содержимого в Silverlight - Средство загрузки файлов

ОГЛАВЛЕНИЕ

Средство загрузки файлов

При написании приложений Silverlight следует помнить о том, что все требуемые ресурсы, которые не включены в пакет XAP приложения, необходимо самостоятельно загрузить с сервера. Класс WebClient является основным средством Silverlight, предназначенным для организации загрузки файлов дополнительных ресурсов. Этот класс предоставляет несколько асинхронных методов для передачи данных веб-ресурсу и получения данных с веб-ресурса. Это происходит следующим образом.

WebClient wc = new WebClient();
wc.DownloadStringCompleted += 
   new DownloadStringCompletedEventHandler(callback);
wc.DownloadStringAsync(address);

Метод DownloadStringAsync использует команду HTTP GET и получает ответ формата URL в виде строки. Ниже показано, как эту строку получает соответствующий обратный вызов.

void callback(object sender, DownloadStringCompletedEventArgs e)
{
  if (e.Error != null)
   return;

  string response = e.Result;
...
}

Вскоре вы увидите, что этот метод идеально подходит для загрузки обычного XAML, не сопровождаемого кодом поддержки. Для программной загрузки двоичных данных, например пакета XAP, требуется поток и несколько иной подход. Класс WebClient по-прежнему полезен, поскольку он предоставляет подходящий метод в OpenReadAsync.

WebClient wc = new WebClient();
wc.OpenReadCompleted += 
   new OpenReadCompletedEventHandler(callback);
wc.OpenReadAsync(address);

Структура соответствующего обратного вызова точно такая же, как в предыдущем случае. В конечном счете, для получения простой строки используется метод DownloadStringAsync; для получения потока данных используется метод OpenReadAsync. Выбор между загрузкой строки или потока является, главным образом, вопросом предпочтения и зависит, по существу, от того, как предполагается использовать получаемые данные.

Обратите также внимание на то, что WebClient предоставляет пару методов для написания удаленного URL-адреса: метод UploadStringAsync для создания строки и метод OpenWriteAsync для загрузки данных на URL-адрес с помощью потока.

Свойство Headers можно использовать для указания дополнительных заголовков, поскольку по умолчанию данный класс не указывает никаких заголовков. Однако необходимо обратить внимание на то, что некоторые из созданных заголовков платформа вырезает и управляет ими внутренним образом. К ним относятся Referer, Connection и User-Agent. Заголовок Content-Type, если он создан, сохраняется.

Когда дело доходит до загрузки ресурсов, класс WebClient, прежде чем пытаться установить подключение, прозрачно использует кэш обозревателя. Если в кэше нет ресурса XAML или XAP, класс приступает к загрузке. Процесс загрузки содержимого из приложения Silverlight выполняется в результате совместной работы среды выполнения Silverlight и внутренного интерфейса API, предоставляемого размещающим обозревателем подключаемому модулю. Это означает, что под прикрытием WebClient среда выполнения Silverlight обменивается информацией с «песочницей» обозревателя, чтобы проверить, присутствует ли в кэше запрошенный ресурс. Если нет, Silverlight переходит к выполнению своих собственных политик безопасности для авторизации запроса. Когда данные, в конце концов, возвращаются из конечной точки, среда выполнения Silverlight кэширует их локально посредством служб обозревателя в полном соответствии с текущими политиками кэширования.

К классу WebClient и другим классам HTTP из пространства имен Silverlight System.Net применяется ряд ограничений безопасности. В частности, при загрузке посредством потока класс WebClient поддерживает только схемы HTTP и HTTPS, а при загрузке чистого XAML — схему FILE. Доступ с использованием разных схем полностью запрещен, поэтому невозможно классу WebClient указать, например, ресурс HTTPS, если страница размещения загружается посредством HTTP (или наоборот). Запрос WebClient может, вообще говоря, достичь URL-адреса в зоне другого обозревателя, но не в том случае, когда он пытается переместиться из некоторой зоны Интернета в зону с более строгими ограничениями. В настоящее время Silverlight поддерживает зоны только в операционной системе Windows.

И, наконец, междоменный доступ поддерживается только в том случае, если удаленный сайт включен посредством размещения соответствующего файла XML в его корневом каталоге. Отмечу также, что междоменный доступ не работает при использовании моста HTTPS к HTTPS.

Один объект WebClient не в состоянии обрабатывать одновременно несколькo запросов. Необходимо проверить свойство IsBusy, имеющее логическое значение, чтобы определить, может ли ваш код безопасным образом поместить новый запрос посредством этого же экземпляра WebClient. При использовании нескольких объектов WebClient (возможно, на разных потоках) можно одновременно запустить несколько загрузок.