ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Программный код агента
Если открыть сгенерированный файл агента, вы найдете там тип, который получается из System.Web.Services.Protocols.SoapHttpClientProtocol (если, конечно, вы не указали другой протокол связи с помощью опции /protocol).
Этот базовый класс определяет ряд членов, используемых в рамках реализации типа агента. Описания некоторых из этих членов предлагаются в табл. 25.7.
Таблица 25.7. Основные
Унаследованные члены | Описание |
---|---|
BeginInvoke | Метод, инициирующий асинхронный вызов Web-метода |
CancelAsync | Метод (новый в .NET 2.0), отменяющий асинхронный вызов метода Web-сервиса XML, если вызов еще не завершен |
EndInvoke | Метод, завершающий асинхронный вызов Web-метода |
Invoke | Метод для синхронного вызова метода Web-сервиса |
InvokeAsync | Метод (новый в .NET 2.0), предлагающий более предпочтительный вариант асинхронного вызова метода Web-сервиса |
Proxy | Свойство, получающее или устанавливающее информацию агента для запроса Web-сервиса через брандмауэр |
Timeout | Свойство, получающее или устанавливающее значение времени ожидания (в миллисекундах) для синхронных вызовов |
Url | Свойство, получающее или устанавливающее базовое значение URL сервера для запросов |
UserAgent | Свойство, получающее или устанавливающее значение для заголовка пользовательского агента в запросах |
Конструктор, заданный по умолчанию
Заданный по умолчанию конструктор агента "жестко" определяет значение URL удаленного Web-сервиса и запоминает это значение в наследуемом свойстве Url.
Очевидным недостатком такого подхода является то, что при переименовании или перемещении Web-сервиса XML класс агента приходится обновлять и перекомпилировать. Для построения более гибкого типа агента wsdl.exe предлагает использовать флаг /appsettingurlkey (который можно сократить до /urlkey). Если указать в командной строке этот флаг, конструктор агента будет содержать программную логику для чтения URL с помощью ключа, содержащегося в файле *.config клиента.
Если теперь проверить конструктор агента, заданный по умолчанию, вы обнаружите следующий программный код (заметьте, что если подходящий ключ не будет найден, в качестве резервного будет использоваться заданное конкретное значение URL).
Соответствующий
файл app.config на стороне клиента будет примерно таким.Поддержка синхронного вызова
Генерируемый агент определяет также поддержку синхронного вызова Web-методов. Например, синхронный вариант метода Subtract реализуется так.
Обратите внимание на то, что вызывающая сторона передает два параметра, "упакованные" в массив System.Object. Используя динамическое связывание, метод Invoke передаст эти аргументы методу вычитания, размещенному по указанному адресу URL. По завершении этого (блокирующего) вызова будет обработан поступающий XML-код и результат будет возвращен вызывающей стороне в виде System.Int32 после соответствующего преобразования.
Поддержка асинхронного вызова
Поддержка асинхронного вызова Web-методов в .NET 2.0 сильно изменилась по сравнению с .NET 1.x. По своему предыдущему опыту вы можете знать, что агенты .NET 1.1 использовали методы BeginXXX/EndXXX для вызова Web-методов во вторичном потоке выполнения. Рассмотрите, например, следующие методы BeginSubtract и EndSubtract.
Хотя wsdl.exe все еще генерирует эти знакомые методы Begin/End, в .NET 2.0 они считаются устаревшими, поскольку заменены новыми методами XXXAsync.
Новые методы XXXAsync (как и связанный с ними метод CancelAsync) работают в паре с автоматически генерируемым вспомогательным методом (являющимся перегруженной версией некоторого специального метода XXXAsync), который обрабатывает асинхронные операции, используя синтаксис событий C#. Если рассмотреть программный код агента, вы увидите, что wsdl.exe генерирует (для каждого Web-метода) пользовательский делегат, пользовательское событие и пользовательский класс "event args", чтобы получить соответствующий результат.
Создание приложения клиента
Теперь, когда вы лучше понимаете внутреннюю композицию генерируемого агента, давайте попытаемся его использовать. Создайте новое консольное приложение с именем CalculatorClient, добавьте в проект файл proxy.cs с помощью выбора Project->Add Existing Item из меню и добавьте ссылку на компоновочный блок System.Web.Services.dll. Затем измените метод Main так, как предлагается ниже.