Compartir a través de


Integración de COM+: hospedado por COM+

Download sample

Este ejemplo muestra cómo exponer una interfaz de una aplicación COM+ como un servicio Windows Communication Foundation (WCF) y cómo llamarlo desde un cliente WCF. Este ejemplo está compuesto por un programa (.exe) de consola de cliente y una aplicación (.dll) de biblioteca de Enterprise Services registrados dentro de COM+. El ejemplo está basado en el ejemplo Ejemplo de introducción que implementa un servicio de calculadora y es similar al ejemplo Integración de COM+: hospedado en Web. Utilizando hospedaje de COM+ y transporte TCP, este ejemplo muestra un enfoque con mejor rendimiento que el del ejemplo Integración de COM+: hospedado en Web pero exige activar la aplicación COM+ explícitamente antes de poder procesar solicitudes.

Nota

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

La aplicación Enterprise Services contiene un componente único que implementa una interfaz ICalculator única que expone métodos matemáticos (Sumar, Restar, Multiplicar y Dividir).

// Define the component's interface.
public interface ICalculator
{
    double Add(double n1, double n2);
    double Subtract(double n1, double n2);
    double Multiply(double n1, double n2);
    double Divide(double n1, double n2);
}

Esta interfaz se expone como un contrato de servicios que define un modelo de comunicación de respuestas y solicitudes. El cliente realiza solicitudes sincrónicas a una operación matemática y el servicio y el componente subyacente responden con el resultado. La actividad del cliente es visible en la ventana de la consola.

El servicio se hospeda en proceso con COM+ y ServiceModelHostedSample de la aplicación se debe iniciarse manualmente para activar los extremos de servicio. La implementación de la clase ESCalculatorServicecalcula y devuelve el resultado adecuado.

// Supporting implementation for the ICalculator interface.
public class ESCalculatorService : ServicedComponent, ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}

Nota

La clase no incluye ningún código específico de ServiceModel y es un ensamblado Enterprise Services típico que se atribuye con atributos Enterprise Services, el cual se firma y agrega a la Caché de Ensamblados Global (GAC).

COM+ Service Model Configuration Tool (ComSvcConfig.exe) se utiliza para agregar un servicio de apoyo para la interfaz seleccionada. Se utiliza el siguiente código para realizar esto:

ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose

En este caso, la herramienta agrega un servicio para la interfaz ICalculator del componente ServiceModelHostedSample.ESCalculator, que está dentro de la aplicación ServiceModelHostedSample. El servicio se hospeda dentro de COM+, con un extremo de intercambio de metadatos. Un componente ServiceModelInitializer se agrega a la aplicación para facilitar la integración y un archivo de configuración de la aplicación se genera en el directorio raíz de aplicación de la aplicación COM+; para esta aplicación, es Aplicaciones %PROGRAMFILES%\ComPlus" \{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9} \." Durante el inicio de la aplicación, el componente ServiceModelInitializer comprueba el archivo de configuración de la aplicación e inicia los extremos de servicio apropiadamente configurados.

Para los servicios hospedados por COM+, la herramienta COM+ Service Model Configuration Tool (ComSvcConfig.exe) crea extremos de servicio mediante netNamedPipeBinding que sólo proporciona para el mismo acceso del equipo. El archivo de configuración se debe editar con posterioridad para proporcionar extremos en otros transportes. Este ejemplo utiliza un archivo de configuración personalizado que expone la aplicación en TCP y HTTP según el uso de los enlaces wsHttpBinding y netTcpBinding:

<!-- Specify the service (application and component GUIDs) and service and MEX endpoints -->
<services>
  <service behaviorConfiguration="ComServiceMexBehavior"
           name="{4CDCDB2C-0B19-4534-95CD-FBBFF4D67DD9},{C2B84940-AD54-4A44-B5F7-928130980AB9}">
    <endpoint
           address="ICalculator"
           binding="netTcpBinding"
           bindingConfiguration="comNonTransactionalBinding"
           contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
    <endpoint
           address="ICalculator"
           binding="wsHttpBinding"
           bindingConfiguration="comNonTransactionalBinding"
           contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
    <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange" />
    <host>
      <!-- Specify base addresses for both transports -->
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8081/ServiceModelHostedSample" />
        <add baseAddress="https://localhost:8082/ServiceModelHostedSample" />
      </baseAddresses>
    </host>
  </service>
</services>

En este ejemplo, el archivo de configuración personaliza también el nombre y espacio de nombres para el servicio y se puede utilizar para exponer sólo un subconjunto de las operaciones que ofrece el componente. En este caso, el método Dividir se ha marcado con comentarios y se ha omitido del contrato de servicios expuesto:

<!-- comContract specifying the name, namespace and methods for the service -->
<comContracts>
  <comContract
      contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}"
      name="ICalculator"
      namespace="https://microsoft.com/Microsoft.ServiceModel.Samples/EnterpriseServicesHosted"
      requiresSession="true">
    <exposedMethods>
      <add exposedMethod="Add" />
      <add exposedMethod="Subtract" />
      <add exposedMethod="Multiply" />
      <!-- <add exposedMethod="Divide" /> -->
    </exposedMethods>
  </comContract>
</comContracts>

El cliente comunica en un contrato utilizando un cliente que es generado por Service Metadata Utility Tool (Svcutil.exe). El cliente se contiene en el archivo generatedClient.cs con una configuración compatible en App.config. Esta utilidad recupera los metadatos para un servicio y genera un cliente que se utiliza para comunicar en un tipo de contrato. El servicio hospedado debe estar disponible para generar el código cliente, porque se utiliza para recuperar los metadatos del servicio. 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:8082/ServiceModelHostedSample/mex /out:generatedClient.cs /config:App.config

La implementación del cliente construye una instancia del cliente generado utilizando la configuración de enlace TCP. En ese momento se puede utilizar para iniciar la comunicación con el servicio.

// Create a client.
CalculatorClient client = new CalculatorClient("NetTcpBinding_ICalculator ");
WSHttpBinding_ICalculator
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Al ejecutar el ejemplo, las solicitudes y respuestas de la operación se muestran en la ventana de la consola del cliente. Esto muestra el uso del servicio WCF generado de un cliente WCF. Presione Entrar en la ventana de cliente para cerrar el cliente.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25

Press <ENTER> to terminate client.

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. El proceso de generación incluye ejecutar un script que crea la aplicación COM+ y lo marca como "Permitir que se ejecute cuando está inactivo"; esto evita que el extremo de servicio se cierre automáticamente debido a inactividad.

  3. A través de un símbolo del sistema, navegue hasta la carpeta service\bin del ejemplo. Si usa Windows Vista o Windows Server 2008, asegúrese de que ejecuta el símbolo del sistema como Administrador.

  4. Escriba gacutil.exe /i ESCalculatorHosted.dll para agregar el ensamblado a la Caché de Ensamblados Global (GAC). Asegúrese de que Gacutil.exe está en su ruta de acceso.

  5. Escriba regsvcs.exe ESCalculatorHosted.dll para registrar el componente del ensamblado y la aplicación ServiceModelSample con COM+. Asegúrese de que Regsvcs.exe está en su ruta de acceso.

  6. Entre en ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose para exponer la interfaz como un servicio hospedado en Internet Information Services (IIS). Asegúrese de que ComSvcConfig.exe está en su ruta de acceso.

  7. Para reemplazar la configuración predeterminada con la configuración personalizada de este ejemplo, copie el archivo Service/application.config en el directorio %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\.

Para ejecutar el ejemplo en el mismo equipo

  1. Para iniciar la aplicación y los extremos, utilizando la consola de administración de Servicios de Componente, haga clic con el botón derecho en ServiceModelHostedSample y seleccione Iniciar.

  2. Pruebe que puede tener acceso a los servicios utilizando un examinador escribiendo la dirección siguiente: https://localhost:8082/ServiceModelHostedSample. Como respuesta se debe mostrar una página de confirmación.

  3. Ejecute Client.exe desde \client\bin\, desde la carpeta específica del lenguaje. La actividad del cliente se muestra en la ventana de consola del cliente.

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

    Nota

    El ejemplo genera un programa cliente de aplicación de consola. Deberá iniciarlo mediante el símbolo del sistema para ver el resultado.

Para ejecutar el ejemplo en varios equipos

  1. Copie ESCalculatorHosted.dll desde el directorio service\bin y el archivo CreateAppLeaveRunning.vbs desde el directorio del servicio en un directorio en el equipo del servicio.

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

  3. Ejecute el script CreateAppLeaveRunning.vbs para crear la aplicación COM+ con el valor "Permitir que se ejecute cuando está inactivo" .

  4. Escriba gacutil.exe /i ESCalculatorHosted.dll para agregar el ensamblado a la Caché de Ensamblados Global (GAC). Asegúrese de que Gacutil.exe está en su ruta de acceso.

  5. Escriba regsvcs.exe ESCalculatorHosted.dll para registrar el componente del ensamblado y la aplicación ServiceModelSample con COM+. Asegúrese de que Regsvcs.exe está en su ruta de acceso.

  6. Entre en ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose para exponer la interfaz como un servicio hospedado en IIS. Asegúrese de que ComSvcConfig.exe está en su ruta de acceso.

  7. Para reemplazar la configuración predeterminada con la configuración personalizada de este ejemplo, copie el archivo Service/application.config en el directorio %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\.

  8. En el archivo de configuración de la aplicación del servicio, 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.

  9. Para iniciar la aplicación y los extremos, utilizando la consola de administración de Servicios de Componente, haga clic con el botón derecho en ServiceModelHostedSample y seleccione Iniciar.

  10. Copie los archivos de programa del cliente de la carpeta \client\bin\, bajo la carpeta específica del lenguaje, al equipo cliente.

  11. Si el servicio no se está ejecutando bajo una cuenta de dominio, abra el archivo de configuración del cliente y cambie el valor de dirección de la definición de 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. Si el servicio se está ejecutando bajo una cuenta de dominio, regenere la configuración del cliente ejecutando Svcutil.exe en el servicio. Utilice el archivo generado en lugar del archivo de configuración en el ejemplo. El archivo de configuración generado tiene información de identidad adicional (y contiene todos los valores necesarios para conectarse al extremo de servicio, aunque se trate de la configuración predeterminada.)

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

  13. En el equipo cliente, inicie Client.exe desde el símbolo del sistema.

Para limpiar después del ejemplo

  • Por razones de seguridad, quite el componente ESCalculatorHosted de la Caché de Ensamblados Global, elimine la aplicación COM+ ServiceModelHostedSample y quite el directorio raíz de la aplicación Aplicaciones %PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ cuando acabe con el ejemplo.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.