Предположим, что вы создали WSDL-документ (CarBizObject.wsdl), в котором описывается единственный метод DeleteCar(), получающий на вход целое число и не возвращающий ничего. Этот метод предлагается Web-сервисом XML с именем CarBizObject, который может вызываться с использованием связи SOAP.
Чтобы сгенерировать серверный файл программного кода C# на основе этого WSDL-документа, откройте окно командной строки .NET и вызовите утилиту wsdl.exe с флатом /serverInterface, за которым должно следовать имя соответствующего WSDL-документа. Заметьте, что WDSL-документ может содержаться либо в локальном файле *.wsdl:
wsdl /serverInterface CarBizObject.wsdl
либо получаться динамически по данному URL с помощью указания суффикса ?wsdl:
wsdl /serverInterface http://localhost/CarService/CarBizObject.asmx ?wsdl
После того как wsdl.exe обработает соответствующие XML-элементы, вы получите описания интерфейсов для каждого Web-метода.
[System.Web.Services.WebServiceBindingAttribute(
Name="CarBizObjectSoap",
Namespace="http://IntertechTraining.com/")]
public partial interface ICarBizObjectSoap{
…
void RemoveCar(int carID);
}
Используя эти интерфейсы, вы можете определить класс, реализующий различные методы Web-сервиса XML.
Исходный код. Файл CarBizObject.wsdl размещен в подкаталоге, соответствующем главе 25.
Преобразование WSDL-кода в программный код агента для клиента
Хотя это и нежелательно, но вполне возможно построить базовый программный код клиента, которым будет вручную открывать HTTP-соединение, строить SOAP-сообщения, вызывать Web-методы и выполнять обратную трансляцию поступающего XML-потока в типы данных CTS. Намного более предпочтительным подходом оказывается использование wsdl.exe для генерирования класса агента, который будет представлять Web-методы, определенные данным файлом *.asmx.
Для этого укажите (как минимум) имя генерируемого файла агента (с помощью флага /out) и место размещения WSDL-документа. По умолчанию wsdl.exe генерирует программный код агента на языке C#. Однако если вы хотите иметь программный код агента на другом языке .NET, вы можете использовать флаг /language. Следует также знать, что по умолчанию wsdl.exe генерирует программный код агента, предполагающего связь с удаленным Web-сервисом XML с помощью SOAP. Чтобы созданный агент использовал HTTP-метод GET или POST. следует указать соответствующий протокол связи с помощью /protocol.
Другим важным моментом в отношении генерирования программного кода агента с помощью wsdl.exe является то, что этому инструменту действительно требуется WSDL-документ Web-сервиса XML, а не просто файл с именем *.asmx. С учетом этого следует понимать, что если для разработки и тестирований Web-сервиса вы используете WebDev.WebServer.exe, то перед генерированием программного кода агента для клиента вы, скорее всего, захотите скопировать содержимое проекта в виртуальный каталог IIS.
Для примера предположим. что вы создали новый виртуальный каталог IIS (CalcService), содержащий данные проекта CalculatorService. После этого вы можете сгенерировать программный код агента клиента так.
wsdl /out:proxy.cs http://localhost/CalcService/Secrvice.asmx?wsdl
В качестве замечания подчеркнем, что wsdl.exe не определяет пространство имен .NET для упаковки генерируемых типов C#. если вы не укажете в командной строке флаг /n.
wsdl /out:proxy.cs /n:CalculatorClient http://localhost/CalcService/ Service.asmx?wsdl
Если открыть сгенерированный файл агента, вы найдете там тип, который получается из System.Web.Services.Protocols.SoapHttpClientProtocol (если, конечно, вы не указали другой протокол связи с помощью опции /protocol).
public partial class CalculatorWebService:
System.Web.Services.Protocols.SoapHttpClientProtocol {
…
}
Этот базовый класс определяет ряд членов, используемых в рамках реализации типа агента. Описания некоторых из этих членов предлагаются в табл. 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 |
Свойство, получающее или устанавливающее значение для заголовка пользовательского агента в запросах |
Конструктор, заданный по умолчанию
Читать дальше