Vertrag
Dienstverträge enthalten Metadaten, die definieren, wie ein Dienst Kanalnachrichten verarbeitet.
Ein WS_SERVICE_CONTRACT enthält Metadaten für einen Dienst zum Verarbeiten einer WS_MESSAGE.
Er verfügt über eine WS_CONTRACT_DESCRIPTION und eine Funktionstabelle. Eine Anwendung kann optional WS_SERVICE_MESSAGE_RECEIVE_CALLBACK angeben.
Wenn keine WS_CONTRACT_DESCRIPTION und keine Funktionstabelle angegeben sind, muss die Anwendung WS_SERVICE_MESSAGE_RECEIVE_CALLBACK angeben.
static WS_SERVICE_CONTRACT calculatorContract =
{
&calculatorContractDescription,
NULL,
&calculatorFunctions,
};
Details dazu finden Sie im Rechner-Beispiel.
Vertragsbeschreibung
WS_CONTRACT_DESCRIPTION entspricht Metadaten, die den Typvertrag des Diensts definieren. Diese werden von wsutil.exe generiert.
In Bezug auf WSDL ist eine WS_CONTRACT_DESCRIPTION einem wsdl:portType zugeordnet. Für jeden wsdl:portType im WSDL-Dokument wird eine separate WS_CONTRACT_DESCRIPTION generiert.
Eine Vertragsbeschreibung setzt sich aus Dienstvorgängen zusammen. Diese Vorgänge werden als Array von WS_OPERATION_DESCRIPTION angegeben.
<wsdl:definitions xmlns:soap="https://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://Example.org"
xmlns:wsa="https://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="https://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="https://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="https://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="https://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="https://www.w3.org/2005/08/addressing"
xmlns:wsx="https://schemas.xmlsoap.org/ws/2004/09/mex" targetNamespace="https://Example.org"
xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/">
<wsdl:portType name="ICalculator">
<wsdl:operation name="Add">
<wsdl:input wsaw:Action="https://Example.org/ICalculator/Add"
message="tns:ICalculator_Add_InputMessage" />
<wsdl:output wsaw:Action="https://Example.org/ICalculator/AddResponse"
message="tns:ICalculator_Add_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
Ausführliche Informationen zur Konvertierung von wsdl:portType in WS_CONTRACT_DESCRIPTION finden Sie im Abschnitt zur WSDL-Ausgabe.
Beispiel: WS_CONTRACT_DESCRIPTION
static WS_CONTRACT_DESCRIPTION contractDescriptionICalculator =
{
WsCountOf(serviceOperationsICalculator),
serviceOperationsICalculator
};
Funktionstabelle
Die Funktionstabelle ist eine Struktur von Funktionszeigern, die die einzelnen Dienstvorgänge im Dienstvertrag darstellen. Die Funktionstabellendefinition wird ebenfalls von wsutil.exe generiert.
Beispiel: Funktionstabelle
// Function Table
struct CalculatorServiceFunctionTable
{
AddOperation Add;
SubtractOperation Subtract;
};
// Populate the Function Table
static const CalculatorServiceFunctionTable calculatorFunctions = {Add, Subtract};
Verwenden von WS_SERVICE_MESSAGE_RECEIVE_CALLBACK
WS_SERVICE_MESSAGE_RECEIVE_CALLBACK weist eine zweifache sich gegenseitig ausschließende Rolle auf.
Wenn für WS_SERVICE_CONTRACT eine WS_CONTRACT_DESCRIPTION angegeben wird, wird daraus der Standardnachrichtenhandler für alle Aktionen, die nicht von der angegebenen WS_CONTRACT_DESCRIPTION unterstützt werden. Wenn andernfalls keine WS_CONTRACT_DESCRIPTION für den WS_SERVICE_CONTRACT, aber WS_SERVICE_MESSAGE_RECEIVE_CALLBACK für den WS_SERVICE_CONTRACT angegeben ist, werden alle eingehenden Nachrichten an diesen Rückruf übergeben.
Weitere Beispiele finden Sie unter
Die folgenden Rückrufe sind Teil des Vertrags:
Die folgenden Strukturen sind Teil des Vertrags: