Создание клиента
Создание клиента для веб-служб значительно упрощается в 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.