Общие сведения об уровне модели службы
API модели службы WWSAPI моделирует обмен данными между клиентом и службой как вызовы методов, а не как сообщения данных. В отличие от уровня канала, который поддерживает более традиционные обмены сообщениями между клиентом и службой, модель службы автоматически управляет взаимодействием с помощью прокси-сервера службы на клиенте и узла службы в службе. Это означает, что клиент вызывает созданные функции, а сервер реализует обратные вызовы.
Например, рассмотрим службу калькулятора, которая выполняет сложение и вычитание двух чисел. Сложение и вычитание — это операции, естественно представленные в виде вызовов методов.
Модель службы представляет взаимодействие между клиентом и службой в виде объявленных вызовов методов и поэтому скрывает от приложения сведения о взаимодействии базового уровня канала, что упрощает реализацию службы.
Указание службы
Служба должна быть указана с точки зрения ее шаблонов обмена сообщениями, а также представления сетевых данных. Для служб эта спецификация обычно предоставляется в виде WSDL и документов схемы XML.
Документ WSDL — это XML-документ, содержащий привязку канала и шаблоны обмена сообщениями службы, тогда как документ схемы XML — это XML-документ, определяющий представление данных отдельных сообщений.
Для службы калькулятора и операций сложения и вычитания документ WSDL может выглядеть следующим образом:
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:portType name="ICalculator">
<wsdl:operation name="Add">
<wsdl:input wsaw:Action="http://Example.org/ICalculator/Add"
message="tns:ICalculator_Add_InputMessage" />
<wsdl:output wsaw:Action="http://Example.org/ICalculator/AddResponse"
message="tns:ICalculator_Add_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
Аналогичным образом, его xml-схему можно определить следующим образом:
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Add">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="a" type="xs:int" />
<xs:element minOccurs="0" name="b" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AddResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="result" type="xs:int"
/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Преобразование метаданных в код
Модель службы предоставляет WsUtil.exe в качестве инструмента для обработки этих документов метаданных, преобразуя WSDL-файл в файлы заголовка C и исходные файлы.
WsUtil.exe создает заголовок и источники для реализации службы, а также операции службы на стороне клиента для клиента .
Вызов службы калькулятора из клиента
Как и в случае с реализацией службы, клиент должен включать сгенерированные заголовки или заголовки.
#include "CalculatorProxyStub.h"
Теперь клиентское приложение может создать и открыть прокси-сервер службы, чтобы начать взаимодействие со службой калькулятора.
WS_ENDPOINT_ADDRESS address = {0};
WS_STRING uri= WS_STRING_VALUE(L"http://localhost/example");
address.uri = uri;
if (FAILED (hr = WsCreateServiceProxy(WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, NULL, 0, &serviceProxy, error)))
goto Error;
if (FAILED (hr = WsOpenServiceProxy(serviceProxy, &address, NULL, error)))
goto Error;
Приложение может вызвать операцию Add в службе калькулятора со следующим кодом:
if (FAILED (hr = DefaultBinding_ICalculator_Add(serviceProxy, heap, 1, 2, &result, NULL, 0, NULL, error)))
goto Error;
Сведения о полной реализации службы калькулятора см. в примере кода в httpCalculatorClientExample .
Компоненты модели службы
Взаимодействие отдельных компонентов модели службы WWSAPI в примере калькулятора выглядит следующим образом:
- Клиент создает прокси-сервер службы и открывает его.
- Клиент вызывает функцию Add службы и передает прокси-сервер службы.
- Сообщение сериализуется в соответствии с метаданными сериализации в файлах заголовка и исходных файлов, созданных средством метаданных (WsUtil.exe).
- Сообщение записывается в канал и передается по сети в службу.
- На стороне сервера служба размещается внутри узла службы и имеет конечную точку, прослушивающую контракт ICalculator.
- Используя метаданные модели службы в заглушку, служба десериализует сообщение от клиента и отправляет его в заглушку.
- Серверная служба вызывает метод Add, передавая ему контекст операции. Этот контекст операции содержит ссылку на входящее сообщение.
Компоненты
- Узел службы: размещает службу.
- Прокси-сервер службы. Определяет, как клиент взаимодействует со службой.
- Контекст: контейнер свойств для предоставления сведений о состоянии для операции службы.
- Contract: определение интерфейса службы. Например, ICalculator представляет контракт для службы калькулятора в нашем примере кода.
- WsUtil.exe: средство метаданных модели службы для создания прокси-серверов и заглушек.