Создание клиента
Создание клиента для веб-служб значительно упрощается в WWSAPI с помощью API модели службы и средства WsUtil.exe. Модель службы предоставляет API, который позволяет клиенту отправлять и получать сообщения через канал в качестве вызовов метода C. Средство WsUtil создает заголовки и вспомогательные функции для реализации клиента. Эти заголовки включают типы и прототипы функций для функций C, представляющих службы, предлагаемые целевой веб-службой. Вспомогательные средства используются для создания прокси-сервера, который содержит сведения о привязке и адрес конечной точки для службы.
Использование WsUtil для создания заголовков и вспомогательных элементов
Чтобы создать заголовки и вспомогательные элементы, WsUtil открывает и считывает файлы метаданных для целевой службы — wsdl и xsd- и преобразует их в заголовки; Поэтому необходимо заранее получить файлы метаданных целевой службы, например с помощью SvcUtil, части Windows Communication Foundation. По соображениям безопасности необходимо, чтобы копии этих файлов были надежными. (Дополнительные сведения см. в разделе "Безопасность" в теме инструмента компилятора WsUtil.)
Чтобы запустить WsUtil, используйте следующий синтаксис командной строки, если файлы WSDL и XSD для службы находятся в собственном каталоге: WsUtil.exe *.wsdl *.xsd
. Кроме того, можно указать файлы по полному имени.
WsUtil обычно создает два файла для каждого файла метаданных: заголовок и C-файл. Добавьте эти файлы в проект кодирования и используйте инструкции #include, чтобы включить их в код клиента. (XSD-файлы представляют типы, а файлы WSDL представляют операции.)
Создание прокси для службы
Заголовок, созданный WsUtil, содержит вспомогательную подпрограмму для создания прокси службы с необходимой привязкой. Эта подпрограмма включена в раздел "Вспомогательные процедуры политики" созданного файла заголовка. Например, созданный заголовок для службы калькулятора, показанный в примере httpcalculatorclientexample, будет содержать следующий прототип функции.
HRESULT BasicHttpBinding_ICalculator_CreateServiceProxy(
__in_opt WS_HTTP_BINDING_TEMPLATE* templateValue,
__in_ecount_opt(proxyPropertyCount) const WS_PROXY_PROPERTY* proxyProperties,
__in const ULONG proxyPropertyCount,
__deref_out_opt WS_SERVICE_PROXY** _serviceProxy,
__in_opt WS_ERROR* error);
Включите этот вспомогательный компонент в свой код и передайте дескриптор WS_SERVICE_PROXY для получения дескриптора созданного прокси-сервиса. В самом простом сценарии, когда в функцию передается только дескриптор прокси-сервера службы и объект ошибки, вызов выглядит следующим образом.
hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
NULL,
NULL,
0,
&serviceProxy,
error);
Чтобы создать адресную часть прокси-сервиса, вызовите WsOpenServiceProxy с дескриптором прокси-сервиса и указателем на WS_ENDPOINT_ADDRESS, содержащий адрес конечной точки службы, к которой вы хотите подключиться.
Реализация клиента с прототипами функций
Заголовки, созданные из файлов WSDL службы, также содержат прототипы функций C, представляющие службы, доступные из веб-службы и относящиеся к требуемой привязке. Например, заголовок, созданный для службы калькулятора, показанный в HttpCalculatorServiceExample, будет содержать следующий прототип для операции умножения этой службы.
HRESULT BasicHttpBinding_ICalculator_Multiply(
__in WS_SERVICE_PROXY* _serviceProxy,
__in double n1,
__in double n2,
__out double* MultiplyResult,
__in WS_HEAP* _heap,
__in_ecount_opt(_callPropertyCount) const WS_CALL_PROPERTY* _callProperties,
__in const ULONG _callPropertyCount,
__in_opt const WS_ASYNC_CONTEXT* _asyncContext,
__in_opt WS_ERROR* _error);
Вы можете скопировать прототипы и использовать их в качестве шаблонов для кодирования вызовов функций в клиенте, в каждом случае передавая хендл в прокси-сервер службы. После завершения работы с прокси-сервером службы вызовите WsCloseServiceProxy.