Compartir a través de


Uso del moniker de WCF con clientes COM

Download sample

Este ejemplo muestra cómo utilizar el moniker de servicio Windows Communication Foundation (WCF)para integrar servicios web en entornos de desarrollo basados en COM, como Microsoft Office Visual Basic for Applications (Office VBA) o Visual Basic 6.0. Este ejemplo está compuesto por un cliente de Windows Script Host (.vbs), una librería de cliente compatible (.dll), y una librería de servicio (.dll) hospedados por Internet Information Services (IIS). El servicio es un servicio de calculadora y el cliente COM llama operaciones matemáticas: Sumar, Restar, Multiplicar y Dividir, en el servicio. La actividad Client es visible en las ventanas de cuadro de mensaje.

Nota

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

El servicio implementa un contrato ICalculator definido de la siguiente manera:

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

El ejemplo muestra los tres enfoques alternativos para utilizar el moniker:

  • Contrato con tipo: el contrato se registra como un tipo visible COM en el equipo cliente.

  • Contrato de WSDL: el contrato se proporciona con la forma de un documento WSDL.

  • Contrato de intercambio de metadatos: el contrato se recupera en el tiempo de ejecución a partir de un extremo de intercambio de metadatos (MEX).

Contrato con tipo

Para utilizar el moniker con un uso del contrato con tipo, los tipos apropiadamente atribuidos para el contrato de servicios se deben registrar con COM. Primero, un cliente se debe generar utilizando Service Model Metadata Utility Tool (Svcutil.exe). Ejecute el comando siguiente desde un símbolo del sistema en el directorio cliente para generar el proxy escrito:

svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost/servicemodelsamples/service.svc /out:generatedClient.cs

Esta clase debe estar incluida en un proyecto y el proyecto se debería configurar para generar un ensamblado visible en COM y firmado cuando se compiló. El atributo siguiente debería estar incluido en el archivo AssemblyInfo.cs:

[assembly: ComVisible(true)]

Después de generar el proyecto, registre los tipos visibles en COM utilizando regasm:

regasm.exe /tlb:CalcProxy.tlb client.dll

El ensamblado que se crea se debería agregar a la Caché de Ensamblados Global. Aunque no estrictamente necesario, esto simplifica el proceso del tiempo de ejecución localizando el ensamblado. El comando siguiente agrega el ensamblado en la caché de ensamblados global.

gacutil.exe /i client.dll

Nota

El moniker de servicio requiere sólo el registro de tipo y no utiliza el proxy para comunicarse con el servicio.

La aplicación cliente ComCalcClient.vbs utiliza la función GetObject para construir un proxy para el servicio, utilizando la sintaxis del moniker del servicio para especificar la dirección, enlace y contrato para el servicio.

Set typedServiceMoniker = GetObject(
"service:address=https://localhost/ServiceModelSamples/service.svc, binding=wsHttpBinding, 
contractType={9213C6D2-5A6F-3D26-839B-3BA9B82228D3}")

Los parámetros utilizados por el moniker especifican:

  • Dirección del extremo del servicio.

  • El enlace que el cliente debería utilizar para conectar con ese extremo. En este caso se utiliza el wsHttpBinding definido por el sistema aunque se pueden definir enlaces personalizados en archivos de configuración del cliente. Para el uso con la Windows Scripting Host, el enlace personalizado se define en un archivo Cscript.exe.config en el mismo directorio que Cscript.exe.

  • El tipo del contrato que se admite en el extremo. Éste es el tipo que se generó y se registró anteriormente. Dado que el script Visual Basic no proporciona un entorno COM con establecimiento inflexible de tipos, se debe especificar un identificador para el contrato. Este GUID es interfaceID de CalcProxy.tlb, que se puede ver utilizando herramientas COM como el Visor de Objetos OLE/COM(OleView.exe). Para los entornos con establecimiento inflexible de tipos como Office VBA o Visual Basic 6.0, agregar una referencia explícita a la biblioteca de tipos y declarando a continuación el tipo del objeto proxy que se puede utilizar en lugar del parámetro de contrato. Esto también proporciona la compatibilidad IntelliSense durante el desarrollo de la aplicación cliente.

Habiendo construido la instancia del proxy con el moniker de servicio, la aplicación cliente puede llamar a los métodos en el proxy, que hace que la infraestructura del moniker de servicio llame a las operaciones de servicio correspondientes:

' Call the service operations using the moniker object
WScript.Echo "Typed service moniker: 100 + 15.99 = " & typedServiceMoniker.Add(100, 15.99)

Al ejecutar el ejemplo, la respuesta de la operación se muestra en una ventana de cuadro de mensaje de Windows Script Host. Esto muestra un cliente COM que realiza llamadas COM utilizando el moniker con tipo para comunicarse con un servicio WCF. A pesar del uso de COM en la aplicación cliente, la comunicación con el servicio está sólo compuesto por las llamadas del Servicio Web.

Contrato WSDL

No se exigen ningún registro de biblioteca de cliente para utilizar el moniker con un contrato WSDL, pero el contrato WSDL para el servicio se debe recuperar a través de un mecanismo fuera de banda, como utilizar un explorador para tener acceso al extremo WSDL para el servicio. El moniker puede tener acceso entonces a ese contrato en el tiempo de ejecución.

La aplicación cliente de ComCalcClient.vbs utiliza FileSystemObject para tener acceso al archivo WSDL localmente guardado y a continuación de nuevo utiliza la función GetObject para construir un proxy para el servicio:

' Open the WSDL contract file and read it all into the wsdlContract string
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("serviceWsdl.xml", ForReading)
wsdlContract = objFile.ReadAll
objFile.Close

' Create a string for the service moniker including the content of the WSDL contract file
wsdlMonikerString = "service:address='https://localhost/ServiceModelSamples/service.svc'"
wsdlMonikerString = wsdlMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
wsdlMonikerString = wsdlMonikerString + ", wsdl='" & wsdlContract & "'"
wsdlMonikerString = wsdlMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"

' Create the service moniker object
Set wsdlServiceMoniker = GetObject(wsdlMonikerString)

Los parámetros utilizados por el moniker especifican:

  • Dirección del extremo del servicio.

  • El enlace que el cliente debería utilizar para conectarse con ese extremo y el espacio de nombres en el que se define ese enlace. En este caso, se usa wsHttpBinding_ICalculator.

  • El WSDL que define el contrato. En este caso ésta es la cadena leída del archivo serviceWsdl.xml.

  • El nombre y espacio de nombres del contrato. Se requiere esta identificación porque el WSDL puede contener más de un contrato.

    Nota

    De forma predeterminada, los servicios WCF generan archivos WSDL independientes para cada espacio de nombres que utilizan. Éstos se vinculan con el uso de la construcción de importación de WSDL. Dado que el moniker espera una definición WSDL única, el servicio debe utilizar un espacio de nombres único como se muestra en este ejemplo o los archivos independientes deben estar combinados manualmente.

Habiendo construido la instancia del proxy con el moniker de servicio, la aplicación cliente puede llamar a los métodos en el proxy, que hace que la infraestructura del moniker de servicio llame a las operaciones de servicio correspondientes:

' Call the service operations using the moniker object
WScript.Echo "WSDL service moniker: 145 - 76.54 = " & wsdlServiceMoniker.Subtract(145, 76.54)

Al ejecutar el ejemplo, la respuesta de la operación se muestra en una ventana de cuadro de mensaje de Windows Script Host. Esto muestra un cliente COM que realiza llamadas COM utilizando el moniker con un contrato WSDL para comunicarse con un servicio WCF.

Contrato de Intercambio de Metadatos

Para utilizar el moniker con un contrato MEX, como con el contrato WSDL, no se requiere ningún registro del cliente. El contrato para el servicio se recupera en el tiempo de ejecución a través del uso interno de Intercambio de Metadatos.

La aplicación cliente ComCalcClient.vbs utiliza de nuevo la función GetObject para construir un proxy para el servicio:

' Create a string for the service moniker specifying the address to retrieve the service metadata from
mexMonikerString = "service:mexAddress='https://localhost/servicemodelsamples/service.svc/mex'"
mexMonikerString = mexMonikerString + ", address='https://localhost/ServiceModelSamples/service.svc'"
mexMonikerString = mexMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
mexMonikerString = mexMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"

' Create the service moniker object
Set mexServiceMoniker = GetObject(mexMonikerString)

Los parámetros utilizados por el moniker especifican:

  • La dirección del extremo de intercambio de metadatos del servicio.

  • Dirección del extremo del servicio.

  • El enlace que el cliente debería utilizar para conectarse con ese extremo y el espacio de nombres en el que se define ese enlace. En este caso, se usa wsHttpBinding_ICalculator.

  • El nombre y espacio de nombres del contrato. Se requiere esta identificación porque el WSDL puede contener más de un contrato.

Habiendo construido la instancia del proxy con el moniker de servicio, la aplicación cliente puede llamar a los métodos en el proxy, que hace que la infraestructura del moniker de servicio llame a las operaciones de servicio correspondientes:

' Call the service operations using the moniker object
WScript.Echo "MEX service moniker: 9 * 81.25 = " & mexServiceMoniker.Multiply(9, 81.25)

Al ejecutar el ejemplo, la respuesta de la operación se muestra en una ventana de cuadro de mensaje de Windows Script Host. Esto muestra un cliente COM que realiza llamadas COM utilizando el moniker con un contrato MEX para comunicarse con un servicio WCF.

Para configurar y generar el ejemplo

  1. Asegúrese de que ha realizado el Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. Para generar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.

  3. Desde un símbolo de sistema, navegue hasta la carpeta \client\bin\, en la carpeta específica del lenguaje. Si usa Windows Vista o Windows Server 2008, asegúrese de que ejecuta el símbolo del sistema como Administrador.

  4. Escriba regasm.exe /tlb: CalcProxy.tlb client.dll para registrar los tipos con COM. Es posible que se produzca una "Advertencia de exportador de biblioteca de tipos" pero no es un problema porque no se requiere el tipo genérico.

  5. Escriba gacutil.exe /i client.dll para agregar el ensamblado a la Caché de Ensamblados Global.

Para ejecutar el ejemplo en el mismo equipo

  1. Pruebe que puede tener acceso al servicio utilizando un explorador escribiendo la dirección siguiente: https://localhost/servicemodelsamples/service.svc. Como respuesta se debe mostrar una página de confirmación.

  2. Ejecute ComCalcClient.vbs desde \client, en la carpeta específica del lenguaje. La actividad del cliente se muestra en ventanas de cuadro de mensaje.

  3. Si el cliente y el servicio no se pueden comunicar, vea Sugerencias para la solución de problemas.

Para ejecutar el ejemplo en varios equipos

  1. En el equipo del servicio, cree un directorio virtual denominado ServiceModelSamples. El script Setupvroot.bat incluido con el ejemplo se puede utilizar para crear el directorio de disco y el directorio virtual.

  2. Copie los archivos de programa de servicio del directorio %SystemDrive%\Inetpub \wwwroot\servicemodelsamples al directorio virtual ServiceModelSamples del equipo de servicio. Asegúrese de incluir los archivos en el directorio \bin.

  3. Copie el archivo de script del cliente de la carpeta \client, en la carpeta específica del lenguaje, al equipo del cliente.

  4. En el archivo script, cambie el valor de la dirección de la definición del extremo para que coincida con la nueva dirección de su servicio. Reemplace cualquier referencia al "localhost" con un nombre de dominio completo en la dirección.

  5. En el archivo WSDL, serviceWsdl.xml, reemplace cualquier referencia al "host local" con un nombre de dominio completo en la dirección.

  6. Copie la librería Client.dll de la carpeta \client\bin\, en la carpeta específica del lenguaje, a un directorio en el equipo del cliente.

  7. Desde un símbolo del sistema, navegue a ese directorio de destino en el equipo del cliente. Si usa Windows Vista o Windows Server 2008, asegúrese de que ejecuta el símbolo del sistema como Administrador.

  8. Escriba regasm.exe /tlb: CalcProxy.tlb client.dll para registrar los tipos con COM. Asegúrese de que la ruta de acceso ha estado establecida a la carpeta que contiene regasm.exe antes de ejecutar el comando.

  9. Escriba gacutil.exe /i client.dll para agregar el ensamblado a la Caché de Ensamblados Global. Asegúrese de que la ruta de acceso ha sido establecida a la carpeta que contiene gacutil.exe antes de ejecutar el comando.

  10. Pruebe que puede tener acceso al servicio desde el equipo cliente utilizando un explorador.

  11. En el equipo cliente, inicie ComCalcClient.vbs.

Para limpiar después del ejemplo

  • Por razones de seguridad, quite la definición del directorio virtual y los permisos concedidos en los pasos de instalación cuando haya acabado con los ejemplos.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.