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


Общие сведения об уровне модели службы

Интерфейс программирования приложений (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 преобразует 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;

Приложение может вызвать операцию "Добавить" в службе калькулятора со следующим кодом:

if (FAILED (hr = DefaultBinding_ICalculator_Add(serviceProxy, heap, 1, 2, &result, NULL, 0, NULL, error)))
    goto Error;

Ознакомьтесь с примером кода HttpCalculatorClientExample для полной реализации службы калькулятора.

Компоненты модели службы

Взаимодействие отдельных компонентов модели службы WWSAPI в примере калькулятора выглядит следующим образом:

  • Клиент создает прокси-сервер службы и открывает его.
  • Клиент вызывает функцию добавления службы и передается в прокси-сервер службы.
  • Сообщение сериализуется в соответствии с метаданными сериализации в файлах заголовков и исходных файлов, созданных средством метаданных (WsUtil.exe).
  • Сообщение записывается в канал и передается по сети в службу.
  • На стороне сервера служба размещается внутри узла службы и имеет конечную точку, прослушивающую контракт ICalculator.
  • Используя метаданные модели службы в заглушке, служба десериализирует сообщение от клиента и отправляет его в заглушку.
  • Служба на стороне сервера вызывает метод Add, передавая его контекст операции. Этот контекст операции содержит ссылку на входящее сообщение.

схема, показывающая взаимодействие отдельных компонентов модели службы WWSAPI.

Компоненты

  • хост службы: осуществляет размещение службы.
  • прокси-сервер службы. Определяет, как клиент взаимодействует со службой.
  • Контекст: контейнер свойств для предоставления сведений о состоянии для операции службы.
  • Контракт: определение интерфейса службы. Например, ICalculator представляет контракт для службы калькулятора в нашем примере кода.
  • WsUtil.exe: инструмент метаданных модели службы для генерации прокси и заглушек.