Поделиться через


Создание клиента

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