Arquitectura de cliente
Las aplicaciones utilizan los objetos de cliente Windows Communication Foundation (WCF) para invocar las 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, vea Introducción a un cliente WCF. Para obtener más información sobre el nivel del canal, vea Extensión de la capa de canales.
Información general
El tiempo de ejecución del modelo de servicio crea clientes WCF, que están compuestos 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 tales clientes a petición, o a través de System.ServiceModel.ChannelFactory o creando una instancia de una clase derivada ClientBase tal y como se genera por 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.
La interfaz IClientChannel, sin embargo, no define ningún contrato de servicios. Es la interfaz del contrato de servicio (que normalmente se genera a partir de los metadatos del servicio utilizando una herramienta como Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe)) la que los declara. Los tipos de cliente WCF extienden IClientChannel y la interfaz del contrato de servicio de destino para que las aplicaciones puedan llamar a las operaciones directamente y también tener acceso a una funcionalidad en tiempo de ejecución del lado del cliente. La creación de un cliente WCF proporciona objetos System.ServiceModel.ChannelFactory de WCF con la información necesaria para crear un tiempo de ejecución que puede conectar e interactuar con el extremo de servicio configurado.
Tal y como se ha mencionado anteriormente, se deben configurar dos tipos de cliente WCF antes de poder utilizarlos. Los tipos de cliente WCF más simples son objetos que derivan de ClientBase (o DuplexClientBase 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 de los objetos ClientBase, vea Introducción a un 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 estrecho de las características de la comunicación utilizan, por lo general, este tipo de cliente, denominado objeto de canal de cliente, porque permite una interacción más directa que el tiempo de ejecución y el sistema de canales del cliente subyacente.
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. Los objetos de cliente WCF y los objetos de canal de cliente WCF utilizan un objeto ChannelFactory para crear las instancias; el objeto de cliente derivado de ClientBase encapsula el control del generador de canales, pero para varios escenarios es absolutamente razonable utilizar 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 está utilizando un objeto de cliente, puede obtener el generador de canales subyacente a partir de un objeto de cliente WCF llamando a la propiedad System.ServiceModel.ClientBase.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 System.ServiceModel.ChannelFactory.CreateChannel. Cuando llama a CreateChannel (o System.ServiceModel.ClientBase.Open, System.ServiceModel.ClientBase.CreateChannelo cualquier operación en un objeto de cliente WCF), no puede modificar el generador de canales y esperar obtener canales en instancias del servicio distintas, aun cuando está cambiando solamente la dirección del extremo 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 utilizando objetos de cliente WCF y canales de cliente WCF, vea Acceso a los servicios utilizando un cliente.
Las dos secciones siguientes describen la creación y uso de objetos de canales 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). 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 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 auxiliar 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 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 auxiliar) 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 System.ServiceModel.ChannelFactory.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 trabajando con clases y objetos preferirán utilizar el objeto de cliente WCF en lugar del canal de cliente WCF.
Vea un ejemplo en Cómo utilizar ChannelFactory.