Compartir vía


Arquitectura de cliente

Las aplicaciones usan objetos de cliente de Windows Communication Foundation (WCF) para invocar operaciones de servicio. En este tema se describen los objetos de cliente WCF, los canales de cliente WCF y sus relaciones con la arquitectura del canal subyacente. Para obtener información general básica sobre los objetos de cliente WCF, consulte Introducción al cliente WCF. Para obtener más información sobre la capa de canal, consulte Extensión de la capa de canal.

Información general

El entorno de ejecución del modelo de servicio crea clientes WCF, que se componen de lo siguiente:

  • Una implementación de cliente generada automáticamente de un contrato de servicio, que convierte las llamadas del código de la aplicación en mensajes salientes y convierte los mensajes de respuesta en parámetros de salida y valores devueltos que la aplicación puede recuperar.

  • Implementación de una interfaz de control (System.ServiceModel.IClientChannel) que agrupa varias interfaces y proporciona acceso a la funcionalidad de control, especialmente la capacidad de cerrar la sesión del cliente y eliminar el canal.

  • Un canal de cliente que se crea basado en los valores de configuración especificados por el enlace utilizado.

Las aplicaciones pueden crear estos clientes a petición, ya sea a través de un System.ServiceModel.ChannelFactory o mediante la creación de una instancia de una clase derivada ClientBase<TChannel> generada por la Herramienta de Utilidad de Metadatos de ServiceModel (Svcutil.exe). Estas clases de cliente preconstruidas encapsulan y delegan a una implementación de canal de cliente que se construye dinámicamente mediante un ChannelFactory. Por lo tanto, el canal de cliente y la fábrica de canales que los produce son el punto focal de interés para esta discusión.

Objetos de cliente y canales de cliente

La interfaz base de los clientes WCF es la System.ServiceModel.IClientChannel interfaz , que expone la funcionalidad de cliente principal, así como la funcionalidad básica del objeto de comunicación de System.ServiceModel.ICommunicationObject, la funcionalidad de contexto de System.ServiceModel.IContextChannely el comportamiento extensible de System.ServiceModel.IExtensibleObject<T>.

Sin embargo, la IClientChannel interfaz no define un contrato de servicio. Estos se declaran mediante la interfaz de contrato de servicio (normalmente se generan a partir de metadatos de servicio mediante una herramienta como serviceModel Metadata Utility Tool (Svcutil.exe)). Los tipos de cliente WCF extienden tanto IClientChannel como la interfaz de contrato de servicio de destino para permitir que las aplicaciones llamen directamente a las operaciones y también tengan acceso a la funcionalidad en tiempo de ejecución del lado cliente. La creación de un cliente WCF proporciona objetos WCFSystem.ServiceModel.ChannelFactory con la información necesaria para crear un entorno de ejecución que pueda conectarse e interactuar con el punto de conexión de servicio configurado.

Como se mencionó anteriormente, los dos tipos de cliente WCF deben configurarse para poder usarlos. Los tipos de cliente WCF más sencillos son objetos que derivan de ClientBase<TChannel> (o DuplexClientBase<TChannel> si el contrato de servicio es un contrato dúplex). Puede crear estos tipos mediante un constructor, configurado programáticamente o mediante un archivo de configuración y, a continuación, llamar directamente para invocar operaciones de servicio. Para obtener información general básica sobre ClientBase<TChannel> los objetos, consulte Introducción al cliente WCF.

El segundo tipo se genera en tiempo de ejecución desde una llamada al CreateChannel método . Las aplicaciones relacionadas con el control estricto de los detalles de la comunicación suelen usar este tipo de cliente, denominado objeto de canal de cliente, ya que permite una interacción más directa que el tiempo de ejecución del cliente subyacente y el sistema de canal.

Generadores de canales

La clase responsable de crear el entorno de ejecución subyacente que admite invocaciones de cliente es la System.ServiceModel.ChannelFactory<TChannel> clase . Tanto los objetos de cliente WCF como los objetos de canal de cliente WCF usan un ChannelFactory<TChannel> objeto para crear instancias; el ClientBase<TChannel> objeto de cliente derivado encapsula el control del generador de canales, pero para varios escenarios es perfectamente razonable usar el generador de canales directamente. El escenario común para esto es si desea crear repetidamente nuevos canales de cliente a partir de una fábrica existente. Si usa un objeto de cliente, puede obtener el generador de canales subyacente de un objeto de cliente WCF mediante una llamada a la propiedad ClientBase<TChannel>.ChannelFactory.

Lo importante que debe recordar sobre los generadores de canales es que crean nuevas instancias de canales de cliente para la configuración proporcionada para ellos antes de llamar a ChannelFactory<TChannel>.CreateChannel. Una vez que llame a CreateChannel (o ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel, o cualquier operación en un objeto de cliente WCF), no puede modificar la factoría de canales y esperar obtener canales hacia diferentes instancias de servicio, incluso si simplemente cambia la dirección del punto final de destino. Si desea crear un objeto de cliente o un canal de cliente con una configuración diferente, primero debe crear un generador de canales nuevo.

Para obtener más información sobre varios problemas relacionados con el uso de objetos de cliente WCF y canales de cliente WCF, vea Acceso a servicios mediante un cliente WCF.

En las dos secciones siguientes se describe la creación y el uso de objetos de canal de cliente WCF.

Crear un nuevo objeto de canal de cliente WCF

Para ilustrar el uso de un canal de cliente, suponga que se ha generado el siguiente contrato de servicio.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Para conectarse a un ISampleService servicio, use la interfaz de contrato generada directamente con un generador de canales (ChannelFactory<TChannel>). Cuando crea y configura un generador de canales para un contrato determinado, puede llamar al método CreateChannel para devolver objetos de canal de cliente que puede utilizar para comunicar con un servicio ISampleService.

Al utilizar la clase ChannelFactory<TChannel> con una interfaz del contrato de servicios, debe convertirse a la interfaz IClientChannel para abrir, cerrar, o anular el canal explícitamente. Para facilitar su funcionamiento, la herramienta Svcutil.exe también genera una interfaz del asistente que implementa la interfaz del contrato de servicio y IClientChannel para permitir que usted interactúe con la infraestructura del canal de cliente sin tener que convertirse. El código siguiente muestra la definición de un canal de cliente auxiliar que implementa el contrato de servicio anterior.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Crear un nuevo objeto de canal de cliente WCF

Para usar un canal de cliente para conectarse a un ISampleService servicio, use la interfaz de contrato generada (o la versión del asistente) directamente con un generador de canales, pasando el tipo de la interfaz de contrato como parámetro de tipo. Una vez que se ha creado y configurado un generador de canales para un contrato determinado, puede llamar al método ChannelFactory<TChannel>.CreateChannel para devolver objetos de canal de cliente que puede usar para comunicarse con un servicio ISampleService.

Cuando se crean, los objetos de canal de cliente implementan IClientChannel y la interfaz de contrato. Por lo tanto, puede usarlos directamente para llamar a operaciones que interactúen con un servicio que admita ese contrato.

La diferencia entre usar objetos de cliente y objetos de canal de cliente es simplemente uno de control y facilidad de uso para los desarrolladores. Muchos desarrolladores que se sienten cómodos trabajando con clases y objetos prefieren usar el objeto de cliente WCF en lugar del canal de cliente WCF.

Para obtener un ejemplo, vea Cómo: Usar ChannelFactory.