契約

サービス コントラクトには、サービスがチャネル メッセージを処理する方法を定義するメタデータが含まれています。

WS_SERVICE_CONTRACT には、サービスが WS_MESSAGE を処理するためのメタデータが含まれています。

Diagram showing WS_SERVICE_CONTRACT metadata in a message to a service endpoint.

WS_CONTRACT_DESCRIPTION と関数テーブルがあります。 アプリケーションでは、必要に応じて WS_SERVICE_MESSAGE_RECEIVE_CALLBACK を指定できます。

WS_CONTRACT_DESCRIPTION と関数テーブルが指定されていない場合、アプリケーションは WS_SERVICE_MESSAGE_RECEIVE_CALLBACK を指定する必要があります。

Diagram showing the Add and Subtract service operations in the ICalculator service contract.

static WS_SERVICE_CONTRACT calculatorContract = 
{
    &calculatorContractDescription, 
    NULL, 
    &calculatorFunctions, 
};

詳細については、電卓の例を参照してください。

コントラクトの説明

WS_CONTRACT_DESCRIPTION は、サービスのコントラクト型を定義するメタデータです。 wsutil.exe によって生成されます。

WSDL の観点から、WS_CONTRACT_DESCRIPTION は wsdl:portType にマップされます。 WSDL ドキュメント内の wsdl:portType ごとに、個別の WS_CONTRACT_DESCRIPTION が生成されます。

コントラクトの説明は、1 つ以上のサービス操作で構成されます。 これらの操作は、WS_OPERATION_DESCRIPTION の配列として指定されます。

Diagram showing a WS_CONTRACT_DESCRIPTION as an array of WS_OPERATION_DESCRIPTIONs.

<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>

wsdl:portType から WS_CONTRACT_DESCRIPTION への変換の詳細については、WSDL 出力のセクションを参照してください。

例: WS_CONTRACT_DESCRIPTION

static WS_CONTRACT_DESCRIPTION contractDescriptionICalculator =
{
    WsCountOf(serviceOperationsICalculator),
    serviceOperationsICalculator
};

関数テーブル

関数テーブルは、サービス コントラクト内の各サービス操作を表す関数ポインターの構造体です。 関数テーブルの定義は wsutil.exe によっても生成されます。

例: 関数テーブル

 // Function Table
struct CalculatorServiceFunctionTable
{
      AddOperation Add;
      SubtractOperation Subtract;
};

// Populate the Function Table
static const CalculatorServiceFunctionTable calculatorFunctions = {Add, Subtract};

WS_SERVICE_MESSAGE_RECEIVE_CALLBACK の使用

WS_SERVICE_MESSAGE_RECEIVE_CALLBACK には、同時に使用できないデュアル ロールがあります。

WS_SERVICE_CONTRACTWS_CONTRACT_DESCRIPTION が指定されている場合、指定された WS_CONTRACT_DESCRIPTION でサポートされていないすべてのアクションの既定のメッセージ ハンドラーになります。 そうでない場合、WS_SERVICE_CONTRACTWS_CONTRACT_DESCRIPTION が指定されておらず、WS_SERVICE_CONTRACTWS_SERVICE_MESSAGE_RECEIVE_CALLBACK が指定されている場合、着信メッセージはすべてこのコールバックに渡されます。

その他の例については、以下を参照してください

次のコールバックはコントラクトの一部です。

次の構造体はコントラクトの一部です。