Contrato
Un contrato de servicio incluye metadatos que definen cómo un servicio controla los mensajes del canal.
Un WS_SERVICE_CONTRACT contiene metadatos para que un servicio controle un WS_MESSAGE.
Tiene una WS_CONTRACT_DESCRIPTION y una tabla de funciones. Opcionalmente, una aplicación puede especificar WS_SERVICE_MESSAGE_RECEIVE_CALLBACK.
Si no se proporciona una WS_CONTRACT_DESCRIPTION y una tabla de funciones, la aplicación deberá especificar una WS_SERVICE_MESSAGE_RECEIVE_CALLBACK.
static WS_SERVICE_CONTRACT calculatorContract =
{
&calculatorContractDescription,
NULL,
&calculatorFunctions,
};
Consulte el ejemplo de la calculadora para obtener más información.
Descripción del contrato
WS_CONTRACT_DESCRIPTION son metadatos que definen el tipo de contrato del servicio. Generado por wsutil.exe.
En términos de WSDL, una WS_CONTRACT_DESCRIPTION se asigna a un wsdl:portType. Para cada wsdl:portType en el documento WSDL se generará una WS_CONTRACT_DESCRIPTION independiente.
Una descripción del contrato se compone de una o varias operaciones de servicio. Estas operaciones se proporcionan como una matriz de 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>
Para obtener más información sobre la conversión de wsdl:portType a la WS_CONTRACT_DESCRIPTION, consulte la sección Salida de WSDL.
Ejemplo: WS_CONTRACT_DESCRIPTION
static WS_CONTRACT_DESCRIPTION contractDescriptionICalculator =
{
WsCountOf(serviceOperationsICalculator),
serviceOperationsICalculator
};
Tabla de funciones
La tabla de funciones es una estructura de punteros de función que representan cada una de las operaciones de servicio en el contrato de servicio. La definición de la tabla de funciones también se genera mediante wsutil.exe.
Ejemplo: tabla de funciones
// Function Table
struct CalculatorServiceFunctionTable
{
AddOperation Add;
SubtractOperation Subtract;
};
// Populate the Function Table
static const CalculatorServiceFunctionTable calculatorFunctions = {Add, Subtract};
Usar WS_SERVICE_MESSAGE_RECEIVE_CALLBACK
WS_SERVICE_MESSAGE_RECEIVE_CALLBACK tiene un rol doble mutuamente excluyente.
Si se especifica una WS_CONTRACT_DESCRIPTION en elWS_SERVICE_CONTRACT, se convierte en el controlador de mensajes predeterminado para todas las acciones que no son compatibles con la WS_CONTRACT_DESCRIPTION especificada. De lo contrario, si no se especifica la WS_CONTRACT_DESCRIPTION en el WS_SERVICE_CONTRACT, y la WS_SERVICE_MESSAGE_RECEIVE_CALLBACK se especifica en el WS_SERVICE_CONTRACT todos los mensajes entrantes se pasan a esta devolución de llamada.
Para obtener más ejemplos, consulte
Las siguientes devoluciones de llamada forman parte del contrato:
Las estructuras siguientes forman parte del contrato: