Compartir a través de


Creación de un cliente

La API de modelo de servicio y la herramienta deWsUtil.exe simplifica considerablemente la creación de un cliente para servicios web. El modelo de servicio proporciona una API que permite al cliente enviar y recibir mensajes a través de un canal como llamadas al método C. La herramienta WsUtil genera encabezados y asistentes para implementar el cliente. Estos encabezados incluyen los tipos y prototipos de función para las funciones de C que representan los servicios ofrecidos por el servicio web de destino. Los asistentes se usan para crear el proxy de servicio, que contiene la información de enlace y la dirección del punto de conexión para el servicio.

Uso de WsUtil para generar encabezados y asistentes

Para generar los encabezados y asistentes, WsUtil abre y lee los archivos de metadatos del servicio de destino ( archivos wsdl y xsd) y los convierte en encabezados; por lo tanto, es necesario recuperar los archivos de metadatos para el servicio de destino de antemano, por ejemplo mediante SvcUtil, una parte de Windows Communication Foundation. Por motivos de seguridad, es imperativo que las copias de estos archivos sean de confianza. (Para obtener más información, vea la sección "Seguridad" del tema WsUtil Compiler Tool ).

Para ejecutar WsUtil, use la siguiente sintaxis de línea de comandos si los archivos WSDL y XSD para el servicio están en su propio directorio: WsUtil.exe *.wsdl *.xsd. Como alternativa, puede especificar los archivos por nombre completo.

WsUtil generalmente genera dos archivos para cada archivo de metadatos: un encabezado y un archivo C. Agregue estos archivos al proyecto de codificación y use #include instrucciones para incluirlos en el código del cliente. (Los archivos XSD representan tipos y los archivos WSDL representan operaciones).

Creación del proxy de servicio

El encabezado generado por WsUtil contiene una rutina auxiliar para crear el proxy de servicio con el enlace necesario. Esta rutina se incluye en la sección "Policy helper routines" (Rutinas auxiliares de directivas) del archivo de encabezado generado. Por ejemplo, el encabezado generado para el servicio de calculadora que se muestra en el ejemplo httpcalculatorclientexample contendrá el siguiente prototipo de función.

HRESULT BasicHttpBinding_ICalculator_CreateServiceProxy(
    __in_opt WS_HTTP_BINDING_TEMPLATE* templateValue,
    __in_ecount_opt(proxyPropertyCount) const WS_PROXY_PROPERTY* proxyProperties,
    __in const ULONG proxyPropertyCount,
    __deref_out_opt WS_SERVICE_PROXY** _serviceProxy,
    __in_opt WS_ERROR* error);

Incorpore este asistente en el código y pase un identificador de WS_SERVICE_PROXY para recibir el identificador al proxy de servicio creado. En el escenario más sencillo, en el que solo se pasa un identificador de proxy de servicio y un objeto de error a la función, la llamada es similar a la siguiente.

hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
            NULL,
            NULL,
            0,
            &serviceProxy,
            error);

Para crear la parte de dirección del proxy de servicio, llame a WsOpenServiceProxy con un identificador al proxy de servicio y un puntero a una WS_ENDPOINT_ADDRESS que contenga la dirección del punto de conexión de servicio a la que desea conectarse.

Implementación del cliente con prototipos de función

Los encabezados generados a partir de los archivos WSDL del servicio también contienen prototipos de función de C que representan los servicios disponibles desde el servicio web y específicos del enlace necesario. Por ejemplo, un encabezado generado para el servicio de calculadora que se muestra en HttpCalculatorServiceExample contendrá el siguiente prototipo para la operación de multiplicación de ese servicio.

HRESULT BasicHttpBinding_ICalculator_Multiply(
    __in WS_SERVICE_PROXY* _serviceProxy,
    __in double n1,
    __in double n2,
    __out double* MultiplyResult,
    __in WS_HEAP* _heap,
    __in_ecount_opt(_callPropertyCount) const WS_CALL_PROPERTY* _callProperties,
    __in const ULONG _callPropertyCount,
    __in_opt const WS_ASYNC_CONTEXT* _asyncContext,
    __in_opt WS_ERROR* _error);

Puede copiar los prototipos y usarlos como plantillas para codificar las llamadas de función en el cliente, en cada caso pasando el identificador al proxy de servicio. Cuando haya terminado con el proxy de servicio, llame a WsCloseServiceProxy.