服務模型層概觀

WWSAPI 服務模型 API 會將用戶端與服務之間的通訊模型化為方法呼叫,而不是資料訊息。 相較于通道 ,它支援用戶端和服務之間的較傳統 訊息 交換,服務模型會透過用戶端上的服務 Proxy 以及服務上的服務主機,自動管理通訊。 這表示用戶端會呼叫產生的函式,而伺服器會實作回呼。

例如,假設計算機服務會對兩個數字執行加法和減法。 加法和減法是自然表示為方法呼叫的作業。

此圖顯示計算機服務如何使用方法呼叫來與用戶端通訊,以進行加法和減法。

服務模型代表用戶端與服務之間的通訊做為宣告的方法呼叫,因此會隱藏應用程式基礎通道層的通訊詳細資料,讓服務更容易實作。

指定服務

服務必須根據其訊息交換模式及其網路資料標記法來指定。 對於服務,此規格通常會以 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"

現在,用戶端應用程式可以建立並開啟服務 Proxy,以開始與計算機服務通訊。

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 服務模型元件的互動如下所示:

  • 用戶端會建立 服務 Proxy 並加以開啟。
  • 用戶端會呼叫服務的 Add 函式,並傳入服務 Proxy。
  • 訊息會根據中繼資料工具所產生的標頭和來源檔案中的序列化中繼資料序列化, (WsUtil.exe)
  • 訊息會寫入通道,並透過網路傳送至服務。
  • 在伺服器端,服務裝載在服務主機內,並具有接聽 ICalculator 合約的端點。
  • 使用存根中的服務模型中繼資料,服務會從用戶端還原序列化訊息,並將其分派至存根。
  • 伺服器端服務會呼叫 Add 方法,並傳遞作業內容。 此作業內容包含連入訊息的參考。

此圖顯示個別 WWSAPI 服務模型元件的互動。

單元

  • 服務主機:裝載服務。
  • 服務 Proxy:定義用戶端如何與服務通訊。
  • 內容:屬性包,可讓狀態特定資訊可供服務作業使用。
  • 合約:服務的介面定義。 例如,ICalculator 代表範例程式碼中計算機服務的合約。
  • WsUtil.exe:用來產生 Proxy 和存根的服務模型中繼資料工具。