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


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

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