Асинхронное взаимодействие с XML-веб-службами

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Асинхронное взаимодействие с веб-службой осуществляется в соответствии с двумя шаблонами асинхронного вызова метода, заданными для платформы .NET Framework. Прежде чем перейти к подробностям, важно обратить внимание на то, что веб-служба не должна быть написана каким-то специальным образом, чтобы с ней можно было асинхронно взаимодействовать.

Инструмент Wsdl.exe и асинхронная модель разработки .NET Framework

Когда инструмент Wsdl.exe генерирует клиентский прокси-класс для доступа к заданной веб-службе, он обеспечивает прокси-класс двумя механизмами для взаимодействия с каждым методом веб-службы асинхронно. Первый механизм — шаблон Begin/End. Второй механизм — шаблон управляемого событиями асинхронного программирования, который доступен в версии 2.0 платформы .NET Framework. Краткое описание использования шаблонов с веб-службами см. в последующих разделах. Полное описание обоих шаблонов см. в разделе Asynchronous Programming Design Patterns.

Шаблон вызова Begin/End

Инструмент Wsdl.exe автоматически создает три метода для каждой операции (метод веб-службы в ASP.NET), опубликованной в веб-службе. Один метод — для синхронного доступа, и два — для асинхронного. Это выполняется, даже если метод веб-службы реализуется только синхронно. В следующей таблице описаны указанные три метода:

Имя метода в прокси-классе Описание

<NameOfWebServiceMethod>

Синхронно отправляет сообщение для метода веб-службы с именем <NameOfWebServiceMethod>.

Begin<NameOfWebServiceMethod>

Начинает асинхронный обмен сообщениями с методом веб-службы с именем <NameOfWebServiceMethod>. Клиент дает указания методу Begin начать обрабатывать вызов службы, но ответить (вернуть значение) немедленно. Возвращаемое значение принадлежит не к типу, заданному методом веб-службы, а к типу, реализующему интерфейс IAsyncResult.

End<NameOfWebServiceMethod>

Завершает асинхронный обмен сообщениями с методом веб-службы с именем <NameOfWebServiceMethod>, возвращая значение — результат вызова метода веб-службы.

Методы Begin и End следуют правилам именования для асинхронного шаблона разработки платформы .NET Framework. Шаблон разработки указывает, что существует два асинхронных метода с такими именами для каждого синхронного метода.

Например, рассмотрим класс веб-служб PrimeFactorizer, у которого есть метод веб-службы, выполняющий поиск простых множителей, со следующей сигнатурой:

public long[] Factorize(long factorizableNum)

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

Если инструмент Wsdl.exe использует эту веб-службу для получения входных данных для генерации кода прокси клиента (применяя строку запроса ?wsdl для веб-службы ASP.NET), будут сгенерированы методы со следующими сигнатурами:

public long[] Factorize(long factorizableNum)
public System.IAsyncResult BeginFactorize(long factorizableNum, System.AsyncCallback callback, object asyncState)
public long[] EndFactorize(System.IAsyncResult asyncResult)

Реализация клиента веб-службы, выполняющего асинхронный вызов метода при помощи шаблона Begin/End

Как клиент может узнать, когда вызывать метод End? Для клиента есть два способа определить этот момент, заданных платформой .NET Framework:

  • Технология ожидания: использовать один из методов класса WaitHandle, чтобы заставить клиент ждать завершения метода.

  • Технология обратного вызова: передать функцию обратного вызова методу Begin, который затем вызывается для получения результатов, когда метод завершает обработку.

Примечание. Независимо от того, какую технологию из двух клиент использует для асинхронного взаимодействия с веб-службой, отправляемые и получаемые сообщения SOAP идентичны сообщениям SOAP, сгенерированным при помощи синхронного метода прокси. То есть существует только один посланный по сети запрос и полученный ответ SOAP. Прокси-класс добивается этого благодаря тому, что обрабатывает ответ SOAP с использованием потока, отличного от потока, использованного клиентом для вызова метода Begin. Поэтому клиент может продолжить выполнять другие задачи в своем потоке, пока прокси-класс получает и обрабатывает ответ SOAP.

Технология ожидания при использовании шаблона Begin/End

Класс WaitHandle реализует методы, которые поддерживают ожидание сигнала объектов синхронизации: WaitOne, WaitAny и WaitAll. Сигнал объекта синхронизации — это указание, что потоки, ожидающие определенного ресурса, могут теперь получить доступ к ресурсу. Клиент веб-службы получает доступ к объекту WaitHandle через свойство AsyncWaitHandle объекта IAsyncResult, возвращаемого методом Begin.

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

Технология обратного вызова при использовании шаблона Begin/End

При использовании технологии обратного вызова функция обратного вызова реализует делегат AsyncCallback, который принудительно задает сигнатуру:

public void MethodName(IAsyncResult ar)

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

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

Вызов метода End до завершения асинхронной операции приведет к блокировке вызывающего объекта. Поведение в случае повторного вызова этого метода с тем же значением IAsyncResult, возвращенным методом Begin, не определено.

Асинхронные клиенты веб-службы, использующие управляемую событиями асинхронную модель

В разделе Multithreaded Programming with the Event-based Asynchronous Pattern приводятся вводные сведения о новой асинхронной модели программирования, в которой для обработки обратных вызовов используются события, что упрощает создание многопотоковых приложений без необходимости самостоятельной реализации сложного многопотокового кода. Общие сведения о новой управляемой событиями асинхронной модели см. в разделе Event-based Asynchronous Pattern Overview. Подробные сведения о реализациях клиентов с помощью новой модели см. в разделе How to: Implement a Client of the Event-based Asynchronous Pattern.

Сведения о том, как создать веб-службу с использованием шаблона, управляемого событиями, см. в разделе Как реализовать асинхронный клиент веб-службы с помощью ASP.NET 2.0.

См. также

Задачи

Как реализовать асинхронный клиент веб-службы при помощи технологии ожидания
Как реализовать асинхронного клиента веб-службы при помощи метода обратного вызова
Как выполнить асинхронный вызов из клиента веб-службы

Основные понятия

Создание клиентов XML-веб-службы
Правила разработки XML-веб-служб, созданных с помощью ASP.NET

Другие ресурсы

Создание клиентов для XML-веб-служб