Gambaran Umum Lapisan Model Layanan
API Model Layanan WWSAPI memodelkan komunikasi antara klien dan layanan sebagai panggilan metode, bukan sebagai pesan data. Berbeda dengan lapisan saluran , yang mendukung pertukaran pesan yang lebih tradisional antara klien dan layanan, Model Layanan secara otomatis mengelola komunikasi melalui proksi layanan pada klien dan hos layanan. Ini berarti bahwa panggilan klien menghasilkan fungsi dan server mengimplementasikan panggilan balik.
Misalnya, pertimbangkan layanan kalkulator yang melakukan penambahan dan pengurangan pada dua angka. Penambahan dan pengurangan adalah operasi yang secara alami diwakili sebagai panggilan metode.
Model layanan ini mewakili komunikasi antara klien dan layanan sebagai panggilan metode yang terdefinisi, dengan demikian menyembunyikan detail komunikasi lapisan saluran yang mendasari dari aplikasi, membuat layanan lebih mudah diimplementasikan.
Menentukan Layanan
Layanan harus ditentukan dalam hal pola pertukaran pesannya serta representasi data jaringannya. Untuk layanan, spesifikasi ini biasanya disediakan sebagai dokumen skema WSDL dan XML.
Dokumen WSDL adalah dokumen XML yang berisi pengikatan saluran dan pola pertukaran pesan layanan, sedangkan dokumen skema XML adalah dokumen XML yang menentukan representasi data pesan individual.
Untuk layanan kalkulator dan operasi penambahan dan pengurangannya, dokumen WSDL mungkin terlihat seperti contoh berikut:
<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>
Demikian juga, skema XML-nya dapat didefinisikan sebagai berikut:
<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>
Mengonversi Metadata ke Kode
Model layanan menyediakan WsUtil.exe sebagai alat untuk memproses dokumen metadata ini, mengonversi file WSDL menjadi header C dan file sumber.
WsUtil.exe menghasilkan header dan kode sumber untuk pengembangan layanan serta operasi layanan di pihak klien.
Memanggil Layanan Kalkulator Dari Klien
Seperti halnya implementasi layanan, klien harus menyertakan header-header yang dihasilkan.
#include "CalculatorProxyStub.h"
Sekarang, Aplikasi klien dapat membuat dan membuka proksi layanan untuk memulai komunikasi dengan layanan kalkulator.
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;
Aplikasi dapat memanggil operasi Tambahkan pada layanan kalkulator dengan kode berikut:
if (FAILED (hr = DefaultBinding_ICalculator_Add(serviceProxy, heap, 1, 2, &result, NULL, 0, NULL, error)))
goto Error;
Silakan lihat contoh kode di httpCalculatorClientExample untuk implementasi penuh layanan kalkulator.
Komponen Model Layanan
Interaksi komponen Model Layanan WWSAPI individual dalam contoh Kalkulator adalah sebagai berikut:
- Klien membuat proksi layanan dan membukanya.
- Klien memanggil fungsi Tambahkan layanan, dan meneruskan proksi layanan.
- Pesan diserialisasikan sesuai dengan metadata serialisasi di file header dan sumber yang dihasilkan oleh alat metadata (WsUtil.exe).
- Pesan ditulis ke saluran dan dikirimkan melalui jaringan ke layanan.
- Di sisi server, layanan dihosting dalam host layanan dan memiliki sebuah endpoint untuk mendengarkan kontrak ICalculator.
- Menggunakan metadata Model Layanan di stub, layanan mendeserialisasi pesan dari klien dan mengirimkannya ke stub.
- Layanan sisi server memanggil metode Add, meneruskan konteks operasi kepadanya. Konteks operasi ini berisi referensi ke pesan masuk.
Komponen
- Host layanan: Menghosting layanan.
- Proksi layanan: Menentukan cara klien berkomunikasi dengan layanan.
- Konteks: Wadah properti untuk membuat informasi khusus kondisi tersedia bagi operasi layanan.
- Kontrak : Definisi antarmuka layanan. Misalnya, ICalculator mewakili kontrak untuk layanan kalkulator dalam kode contoh kami.
- WsUtil.exe: Alat metadata Model Layanan untuk menghasilkan proksi dan stub.