Главная » Silverlight » Взаимодействие с сетевыми приложениями

0

Как и другое программное обеспечение, приложение Silverlight должно предо­ставлять возможность взаимодействия с внешним миром для получения и пе­редачи нужной информации. В предыдущих главах уже рассмотрены службы WCF, позволяющие приложению Silverlight извлекать данные из веб-служб путем вызова инкапсулированного кода .NET. Однако во многих ситуациях приложению Silverlight нужны данные из других источников, таких как веб-службы REST, ленты новостей RSS, обычные страницы HTML.

В этой главе рассматриваются способы загрузки данных из разных источни­ков, не основанных на платформе .NET, и преобразования данных в нужный формат. Обсуждаются вопросы обработки данных XML с помощью класса XDocument и средств LINQ. В конце главы рассматривается довольно сложная задача — коммуникация по­средством сокетных соединений.

Новые средства. В Silverlight 3 добавлено быстрое и удобное средство коммуникации — локальное соединение, позволяющее сообщаться приложениям, выполняющимся на одном компьютере.

Взаимодействие с веб-сервером

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

Класс WebClient не только загружает двоичные файлы, но и предоставляет доступ к страницам HTML и веб-службам. Более высокоуровневый класс WebRequest позволяет также передавать значения на сайт. В следующих разделах рассматривается использо­вание этих классов для извлечения информации с веб-сервера. Однако сначала необ­ходимо рассмотреть ограничения, накладываемые моделью безопасности Silverlight на любой код, использующий протокол HTTP.

Примечание. В примерах главы используются решения на основе тестовых сайтов ASP.NET, описанных в главе 1. Тестовые сайты ASP.NET необходимы как для создания веб-службы, так и для использования средств загрузки, встроенных в Silverlight. При запуске приложения Silverlight непосредственно с жесткого диска эти средства недоступны.

Кроссдоменный доступ

Если вы когда-либо создавали веб-страницы с помощью технологии Ajax, то, конеч­но, знакомы с объектом XMLHttpRequest, позволяющим выполнять фоновые запросы. Однако объект XMLHttpRequest накладывает на запрос ряд существенных ограничений. Страница может обращаться к веб-ресурсам (документам HTML, веб-службам, файлам и так далее), только если они находятся на том же веб-сервере. Непосредственный крос­сдоменный запрос на получение информации с другого сайта невозможен.

Платформа Silverlight накладывает на классы WebClient и WebRequest почти такие же ограничения. Это обусловлено требованиями безопасности. Если бы приложение Silverlight могло обращаться к другим сайтам без разрешения пользователя, были бы возможны хакерские атаки типа phishing. Например, когда пользователь зарегистриро­ван в службе Hotmail, зловредное приложение Silverlight могло бы извлекать страницы с данными пользователя. В инфраструктуру Silverlight можно было бы внести изменения, предотвращающие атаки phishing, например связать регистрационные данные с исхо­дным адресом URL. Однако это потребовало бы существенных изменений в принципах работы и конструкции браузеров.

Однако платформа Silverlight состоит не только из ограничений. Фактически в ней заимствован из Flash прием, позволяющий выполнять кроссдоменный доступ с помо­щью файла политики XML. При попытке загрузить данные с веб-сайта Silverlight прове­ряет файл clientaccesspolicy .xml (см. главу 15). Если этого файла нет, Silverlight ищет файл crossdomain. xml. Он играет ту же роль, но первоначально он был введен для при­ложений Flash. Конечный результат для обеих технологий одинаков: внешний сайт, к ко­торому может обратиться приложение Flash, доступен также для приложения Silverlight.

Файл clientaccessploicy.xml или crossdomain.xml должен находиться в корневой папке сайта. Например, если браузер запрашивает содержимое по адресу www. somesite. com/~luther/services/CalendarService.ashx, то надстройка Silverlight ищет файл www. somesite. com/clientaccesspolicy. xml или www. somesite. com/crossdomain. xml. Если ни одного из них не существует или один файл существует, но не предоставляет при­ложению Silverlight доступ к данному домену, приложение не сможет загружать никакое содержимое данного сайта. Часто компании, предоставляющие веб-службы, размещают их в отдельных доменах, чтобы лучше контролировать доступ. Например, сайт Flickr не разрешает доступ к www. flickr. com, но разрешает к www. арі. flickr. com.

Совет. Планируя установить обращение к другому сайту, проверьте, поддерживает ли он кроссдоменный доступ. Для этого попытайтесь запросить файл clientaccesspolicy.xml или crossdomain.xml, расположенный в корневой папке сайта.

В главе 15 рассмотрен файл clientaccesspolicy.xml. Файл crossdomain.xml’ ана­логичен ему. Ниже приведен файл crossdomain.xml, предоставляющий доступ всем доменам.

<?xml version="1.0"?> <cross-domain-policy>

<allow-access-from domain="*" /> </cross-domain-policy>

На сайте TWitter расположен файл clientaccesspolicy.xml, предоставляющий до­ступ нескольким доменам. Это означает, что код Silverlight, загружаемый с других доменов, не имеет доступа к содержимому сайта.

<?xml version="l.0"?> <cross-domain-policy> <allow-access-from domain="*twitter.com" /> <allow-access-from domain="*.discoveringradiance.com" />

<allow-access-from domain="*.umusic.com" /> <allow-access-from domain="*.hippo.com.au" />

</cross-domain-policy>

Существует только один способ обращения из сайта, не упомянутого в списке. Для этого нужно создать серверный объект прокси на сайте ASP.NET, содержащем веб-службу (см. главу 15). Странице Silverlight разрешено вызывать эту веб-службу, потому что стра­ница находится на том же сайте (и даже если не на том же, легко добавить собственный файл clientaccesspolicy.xml, разрешающий доступ). Затем служба может обратиться к нужному сайту и возвратить данные на страницу. Этот способ работоспособен лишь по той причине, что веб-службам разрешено обращаться к любому сайту независимо от кроссдоменных правил доступа. Веб-служба выполняется на сервере, а не в браузере, поэтому она не подчиняется ограничениям безопасности, наложенным на браузер. На рис. 20.1 данный способ сравнивается с непосредственной загрузкой содержимого.

Рис. 20.1. Два способа загрузки содержимого в приложение Silverlight

Создание прокси на стороне сервера — довольно сложная задача, однако это все же приемлемое решение, когда нужно нечасто извлекать небольшие объемы информации. Если же обращаться нужно часто (например, для чтения ленты RSS на сервере, не пре­доставляющем кроссдоменный доступ), накладные расходы существенно возрастают. Сервер будет вынужден выполнять большой объем операций, а приложению Silverlight придется долго ждать запрошенной информации. Возникают две задержки: сначала страница запрашивает веб-службу, а затем веб-служба запрашивает другой сайт.

Теперь, когда вы знакомы с правилами доступа к сайтам, можно приступать к за­грузке содержимого. Далее рассматривается управление разными типами содержимого, однако начнем с базового типа: обычных файлов HTML.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии