Arquitectura de cliente

Las aplicaciones usan objetos de cliente Windows Communication Foundation (WCF) para invocar operaciones de servicio. Este tema trata sobre los objetos de cliente WCF, los canales de cliente WCF y sus relaciones con la arquitectura de canal subyacente. Para obtener información general básica sobre los objetos de cliente WCF, consulte Información general sobre el 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 tiempo de ejecución del modelo de servicio crea clientes WCF, que se componen de lo siguiente:

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

  • Una implementación de una interfaz de control (System.ServiceModel.IClientChannel) que agrupa varias interfaces y proporciona el acceso para controlar la funcionalidad, sobre todo 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 dichos clientes a petición o a través de System.ServiceModel.ChannelFactory o bien mediante la creación de una instancia de una clase derivada ClientBase<TChannel> tal y como genera la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe). Estas clases de cliente ya creadas se encapsulan y delegan en una implementación de canal de cliente que se construye de manera dinámica por un ChannelFactory. Por consiguiente, el canal de cliente y el generador de canales que los genera son el punto de interés focal para este debate.

Objetos cliente y canales de cliente

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

La interfaz IClientChannel, sin embargo, no define ningún contrato de servicios. La interfaz del contrato de servicio los declara (normalmente se generan a partir de los metadatos del servicio mediante una herramienta, como la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe)). Los tipos de cliente WCF amplían IClientChannel y la interfaz de contrato de servicio de destino para permitir que las aplicaciones llamen a operaciones directamente y también tengan acceso a la funcionalidad en tiempo de ejecución del lado del cliente. La creación de un cliente WCF proporciona objetos WCFSystem.ServiceModel.ChannelFactory con la información necesaria para crear un tiempo de ejecución que pueda conectarse e interactuar con el punto de conexión de servicio configurado.

Tal y como se ha mencionado anteriormente, se deben configurar dos tipos de cliente WCF antes de poder usarlos. Los tipos de cliente WCF más simples son objetos que derivan de ClientBase<TChannel> (o DuplexClientBase<TChannel> si el contrato de servicio es un contrato dúplex). Puede crear estos tipos utilizando un constructor, configurado mediante programación, o mediante un archivo de configuración. Después se llama directamente para invocar las operaciones de servicio. Para obtener información general básica sobre los objetos ClientBase<TChannel>, consulte Información general sobre el cliente WCF.

El segundo tipo se genera en el tiempo de ejecución desde una llamada al método CreateChannel. Las aplicaciones relacionadas con el control estricto de las características de la comunicación usan, por lo general, 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 y el sistema de canales del cliente subyacentes.

Generadores de canales

La clase que es responsable de la creación del tiempo de ejecución subyacente que admite las invocaciones del cliente es la clase System.ServiceModel.ChannelFactory<TChannel>. Los objetos de cliente WCF y los objetos de canal de cliente usan un objeto ChannelFactory<TChannel> para crear las instancias; el objeto de cliente derivado de ClientBase<TChannel> encapsula el control del generador de canales, pero para varios escenarios es totalmente razonable que se use directamente el generador de canales. El escenario común para esto es si desea crear repetidamente nuevos canales de cliente a partir de un generador 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 bien cualquier operación en un objeto de cliente WCF), no podrá modificar el generador de canales ni obtener canales en instancias de servicio distintas, aunque simplemente cambie la dirección del punto de conexión de destino. Si desea crear un objeto de cliente o un canal de cliente con una configuración diferente, debe crear primero un nuevo generador de canales.

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

Las dos secciones siguientes describen la creación y el uso de objetos de canal de cliente WCF.

Creación de un nuevo objeto de canal de cliente WCF

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

[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 conectar a un servicio ISampleService, utilice directamente la interfaz de contrato generada 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 del asistente que implementa el contrato de servicios anterior.

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

Creación de un nuevo objeto de canal de cliente WCF

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

Cuando se crea, los objetos de canal de cliente implementan IClientChannel y la interfaz de contrato. Por consiguiente, puede utilizarlos directamente para llamar a las operaciones que interactúan con un servicio que admite ese contrato.

La diferencia entre utilizar los objetos de cliente y los objetos de canal de cliente es básicamente una de control y facilidad de uso para los desarrolladores. Muchos desarrolladores que se sienten cómodos al trabajar con clases y objetos preferirán usar el objeto de cliente WCF en lugar del canal de cliente WCF.

Para obtener un ejemplo, consulte Procedimiento para usar ChannelFactory.