Шрифт:
Другим важным моментом в отношении генерирования программного кода агента с помощью wsdl.exe является то, что этому инструменту действительно требуется WSDL-документ Web-сервиса XML, а не просто файл с именем *.asmx. С учетом этого следует понимать, что если для разработки и тестирований Web-сервиса вы используете WebDev.WebServer.exe, то перед генерированием программного кода агента для клиента вы, скорее всего, захотите скопировать содержимое проекта в виртуальный каталог IIS.
Для примера предположим. что вы создали новый виртуальный каталог IIS (CalcService), содержащий данные проекта CalculatorService. После этого вы можете сгенерировать программный код агента клиента так.
В качестве замечания подчеркнем, что wsdl.exe не определяет пространство имен .NET для упаковки генерируемых типов C#. если вы не укажете в командной строке флаг /n.
Программный код агента
Если открыть сгенерированный файл агента, вы найдете там тип, который получается из System.Web.Services.Protocols.SoapHttpClientProtocol (если, конечно, вы не указали другой протокол связи с помощью опции /protocol).
Этот базовый класс определяет ряд членов, используемых в рамках реализации типа агента. Описания некоторых из этих членов предлагаются в табл. 25.7.
Таблица 25.7. Основные члены типа SoapHttpClientProtocol
| Унаследованные члены | Описание |
|---|---|
| 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 реализуется так.