Контракт
Контракт службы содержит метаданные, определяющие способ обработки сообщений канала службой.
WS_SERVICE_CONTRACT содержит метаданные для службы для обработки WS_MESSAGE.
Она имеет WS_CONTRACT_DESCRIPTION и таблицу функций. Приложение может дополнительно указать WS_SERVICE_MESSAGE_RECEIVE_CALLBACK.
Если WS_CONTRACT_DESCRIPTION и таблица функций не заданы, приложение необходимо указать WS_SERVICE_MESSAGE_RECEIVE_CALLBACK.
static WS_SERVICE_CONTRACT calculatorContract =
{
&calculatorContractDescription,
NULL,
&calculatorFunctions,
};
Дополнительные сведения см. в примере калькулятора.
Описание контракта
WS_CONTRACT_DESCRIPTION — это метаданные, определяющие контракт типа службы. Создано wsutil.exe.
С точки зрения WSDL WS_CONTRACT_DESCRIPTION сопоставляется с wsdl:portType. Для каждого wsdl:portType в документе WSDL создается отдельная WS_CONTRACT_DESCRIPTION .
Описание контракта состоит из одной или нескольких операций службы. Эти операции предоставляются в виде массива WS_OPERATION_DESCRIPTION.
<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_CONTRACT_DESCRIPTION указан в WS_SERVICE_CONTRACT, это становится обработчиком сообщений по умолчанию для всех действий, которые не поддерживаются указанным WS_CONTRACT_DESCRIPTION. В противном случае, если WS_CONTRACT_DESCRIPTION не указан в WS_SERVICE_CONTRACT, а WS_SERVICE_MESSAGE_RECEIVE_CALLBACK указан на WS_SERVICE_CONTRACT все поступающие сообщения передаются этому обратному вызову.
Дополнительные примеры см. в разделе
Следующие обратные вызовы являются частью контракта:
Следующие структуры являются частью контракта: