合约

服务合约包含定义服务如何处理通道消息的元数据。

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

合约说明由一个或多个服务操作组成。 这些操作以 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_CONTRACT 上指定了 WS_CONTRACT_DESCRIPTION,则会成为指定 WS_CONTRACT_DESCRIPTION 不支持的所有操作的默认消息处理程序。 否则,如果未在 WS_SERVICE_CONTRACT 上指定 WS_CONTRACT_DESCRIPTION,但在 WS_SERVICE_CONTRACT 上指定了 WS_SERVICE_MESSAGE_RECEIVE_CALLBACK,则将传入的所有消息都传递给此回调。

有关更多示例,请参阅

以下回调是合约的一部分:

以下结构是合约的一部分: