Главная » Silverlight » Вызов веб-службы

0

Чтобы применить класс прокси, объявите пространство имен, заданное для ссыл­ки веб-службы в п. 3. Предположим, используется пространство имен MyWebServer, а проект имеет имя MySilverlightProject. Тогда в код нужно добавить следующую директиву.

using MySilverlightProject.MyWebServer;

В Silverlight все вызовы веб-служб должны быть асинхронными. Это означает, что вызывающий метод передает запрос и немедленно завершается, не дожидаясь ответа. Код может продолжить выполнение других задач, а пользователь — взаимодействие с интерфейсом приложения. Когда придет ответ, класс прокси сгенерирует событие за­вершения вызова, имя которого имеет вид имя_методаСотр1е1ес1. Чтобы использовать результат запроса, необходимо подключить к событию завершения обработчик.

Примечание. Состоящий из двух частей процесс коммуникации требует больших накладных расходов для вызова веб-службы, чем взаимодействие между обычными локальными объектами. Однако он позволяет разработчикам создавать приложения Silverlight, реагирующие на действия пользователя в период между запросом и ответом. Этот период почти всегда занимает заметное время. Запрос к веб-службе по каналам НИР при установленном по умолчанию времени ожидания занимает одну минуту. Конечно, пользователь будет очень недоволен, если все это время он может только сидеть и ждать. Существует подозрение, что в Microsoft умышленно ввели ограничение времени ожидания, чтобы плохие разработчики не могли повредить репутации платформы.

Ниже приведен пример вызова рассмотренного ранее метода TestService. GetServerTime().

// Создание класса прокси

TestServiceClient proxy = new TestServiceClient() ;

// Подключение обработчика завершения вызова

proxy.GetServerTimeCompleted += new

EventHandler<GetServerTimeCompletedEventArgs> (GetServerTimeCompleted);

// Запуск вызова службы

proxy.GetServerTimeAsync() ;

Чтобы получить результаты вызова, нужно обработать событие завершения и про­верить объект EventArgs. При генерации класса прокси программа Visual Studio соз­дает отдельный класс EventArgs для каждого метода. Отличие между ними состоит только в свойстве Result, тип которого соответствует возвращаемому значению ме­тода. Например, рассмотренный ранее метод GetServerTime () работает с классом GetServerTimeCompletedEventArgs, который предоставляет объект DateTime посред­ством свойства Result.

При обращении к свойству Result в первый раз необходимо применить код обработ­ки исключения. Это объясняется тем, что при неуспешном вызове службы (например, если сервер не найден, исчерпано время соединения или метод возвращает ошибку) генерируется исключение. Можете также проверить свойство Error пользовательского объекта EventArgs. Например, если значение GetServerTimeCompletedEventArgs .Error равно null, значит, при обработке запроса ошибки не произошло и можно смело ис­пользовать значение свойства Result.

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

private void GetServerTimeCompleted(object sender, GetServerTimeCompletedEventArgs e)

{

try {

lblTime.Text = e.Result.ToLongTimeString();

}

catch (Exception err) {

lblTime.Text =

"Ошибка: соединение с веб-службой не установлено";

}

)

Совет. Вызовы веб-служб выполняются в фоновом потоке, тем не менее, при генерации события завершения вызова можно не беспокоиться о диспетчеризации потока. Это объясняется тем, что класс прокси обеспечивает генерацию события завершения в главном потоке пользовательского интерфейса, предоставляя беспрепятственный доступ к элементам управления, размещенным на странице.

По умолчанию класс прокси ждет ответа одну минуту. Сконфигурировать время ожидания можно с помощью приведенного ниже кода в любой момент перед вызовом веб-службы.

proxy.InnerChannel.OperationTimeout = TimeSpan.FromSeconds(30);

Исключения веб-служб

Вы можете подумать, что когда метод веб-службы сгенерировал исключение, его можно перехватить в коде Silverlight. Однако не все так просто.

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

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

Что происходит при возникновении ошибки в методе веб-службы? В первую очередь, сервер возвращает клиен­ту обобщенное сообщение об ошибке. В сообщении приводится код 500 статуса HTTP, обозначающий внутреннюю ошибку. В соответствии с правилами безопасности, соблюдаемыми браузерами, при этом коде статуса приложение Silverlight не имеет доступа к дополнительной информации об ошибке, даже если эта информация есть в сообщении. Приложение лишь обнаруживает ошибку и генерирует исключение CommunicationException, не содержащее полезной информации.

В Silverlight существует способ обойти это ограничение и получить от сервера более подробную информацию об ис­ключении, однако, в связи с упомянутыми выше правилами безопасности, этот способ полезен только при отладке. Для получения информации об ошибке нужно выполнить две утомительные операции. Во-первых, нужно применить специальные средства WCF, изменяющие на сервере кода статуса НИР с 500 на 200 перед его передачей клиенту. При коде статуса 200 браузер не накладывает никаких ограничений на чтение ответа HTTP. Во-вторых, необходим ме­ханизм возврата информации об исключении. Надстройка Silverlight предоставляет средства конфигурирования веб- службы, которые позволяют вставить исключение в сообщение об ошибке.

Дополнительную информацию можно получить на странице www. tinyurl. com/nytox, на которой описаны сред­ства WCF, изменяющие код статуса HTTP, конфигурационные параметры, позволяющие вставить информацию об ис­ключении в сообщение об ошибке, и клиентский код, извлекающий информацию об ошибке.

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

По теме:

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