服務模型層概觀
WWSAPI 服務模型 API 會將用戶端與服務之間的通訊模型化為方法呼叫,而不是數據訊息。 相較於支援客戶端與服務之間更傳統 訊息 交換的 通道層,服務模型會自動透過用戶端上的服務代理和服務主機端上的服務代理來管理通訊。 這表示用戶端會呼叫產生的函式,而伺服器會實作回呼。
例如,假設計算器服務會對兩個數字執行加法和減法。 加法和減法是自然表示為方法呼叫的作業。
服務模型代表用戶端與服務之間的通訊做為宣告的方法呼叫,因此會隱藏應用程式基礎通道層的通訊詳細數據,讓服務更容易實作。
指定服務
服務必須根據其訊息交換模式以及其網路數據表示來指定。 針對服務,此規格通常會以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"
現在,用戶端應用程式可以建立並開啟服務 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 服務模型元件的互動如下所示:
- 用戶端建立 服務代理,並將其開啟。
- 用戶端會呼叫服務的 Add 函式,並傳入服務代理。
- 訊息會根據元數據工具所產生的標頭和來源檔案中的串行化元數據進行串行化(WsUtil.exe)。
- 訊息會寫入通道,並透過網路傳輸至服務。
- 在伺服器端,服務被託管在服務主機內,並有一個端點負責接聽 ICalculator 合約。
- 在存根中使用服務模型的元數據,服務會從用戶端反序列化訊息,並將訊息發送至存根。
- 伺服器端服務會呼叫 Add 方法,並傳遞作業內容。 此操作環境包含傳入訊息的參考。
元件
- 服務主機:托管服務。
- 服務 Proxy:定義用戶端如何與服務通訊。
- 內容:屬性包,可供服務操作存取特定狀態的資訊。
- 合約:服務的介面定義。 例如,ICalculator 在我們的範例程式代碼中代表計算機服務的合約。
- WsUtil.exe:用於生成代理和存根的服務模型元數據工具。