Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En una aplicación que realiza una llamada, el nivel de modelo de servicio es responsable de traducir las invocaciones de método en el código de aplicación a mensajes salientes, insertarlos en los canales subyacentes, traducir los resultados en valores devueltos y parámetros de salida en el código de aplicación y devolver los resultados al autor de la llamada. Las extensiones del modelo de servicio modifican o implementan el comportamiento de ejecución o comunicación y las características que implican la funcionalidad de cliente o distribuidor, comportamientos personalizados, interceptación de mensajes y parámetros y otras funcionalidades de extensibilidad.
En este tema se describe cómo usar las ClientRuntime clases y ClientOperation en una aplicación cliente de Windows Communication Foundation (WCF) para modificar el comportamiento de ejecución predeterminado de un cliente WCF o interceptar o modificar mensajes, parámetros o valores devueltos antes o posteriores para enviarlos o recuperarlos desde la capa de canal. Para obtener más información sobre cómo extender el tiempo de ejecución del servicio, consulte Extensión de distribuidores. Para obtener más información sobre los comportamientos que modifican e insertan objetos de personalización en el tiempo de ejecución del cliente, consulte Configuración y extensión del runtime con comportamientos.
Clientes
En un cliente, un objeto de cliente WCF o un canal de cliente convierte las invocaciones de método en mensajes salientes y mensajes entrantes a los resultados de la operación que se devuelven a la aplicación que realiza la llamada. (Para obtener más información sobre los tipos de cliente, vea Arquitectura de cliente WCF).
Los tipos de cliente WCF tienen tipos de entorno de ejecución que controlan esta funcionalidad de nivel de punto de conexión y operación. Cuando una aplicación llama a una operación, ClientOperation traduce los objetos salientes en un mensaje, procesa interceptores, confirma que la llamada saliente se ajusta al contrato de destino y entrega el mensaje saliente a ClientRuntime, que es responsable de crear y administrar canales salientes (y canales entrantes en el caso de servicios dúplex), controlando el procesamiento de mensajes salientes adicionales (como la modificación del encabezado), procesar interceptores de mensajes en ambas direcciones y enrutar llamadas dúplex entrantes al cliente del objeto DispatchRuntime adecuado. Tanto ClientOperation como ClientRuntime proporcionan servicios similares cuando los mensajes (incluidos los errores) se devuelven al cliente.
Estas dos clases en tiempo de ejecución son la extensión principal para personalizar el procesamiento de los objetos y canales de cliente WCF. La ClientRuntime clase permite a los usuarios interceptar y ampliar la ejecución del cliente en todos los mensajes del contrato. La ClientOperation clase permite a los usuarios interceptar y ampliar la ejecución del cliente para todos los mensajes de una operación determinada.
La modificación de las propiedades o la inserción de personalizaciones se realizan mediante comportamientos de contrato, punto de conexión y operación. Para obtener más información sobre cómo usar estos tipos de comportamientos para realizar personalizaciones en tiempo de ejecución de cliente, consulte Configuración y extensión del entorno de ejecución con comportamientos.
Escenarios
Hay varias razones para ampliar el sistema cliente, entre las que se incluyen:
Validación de mensajes personalizada. Es posible que un usuario quiera exigir que un mensaje sea válido para un esquema determinado. Esto se puede hacer mediante la implementación de la IClientMessageInspector interfaz y la asignación de la implementación a la MessageInspectors propiedad . Para obtener ejemplos, vea Cómo: Inspeccionar o modificar mensajes en el cliente y Cómo: Inspeccionar o modificar mensajes en el cliente.
Registro de mensajes personalizado. Es posible que un usuario quiera inspeccionar y registrar algunos conjuntos de mensajes de aplicación que fluyen a través de un punto de conexión. Esto también se puede lograr con las interfaces del interceptor de mensajes.
Transformaciones de mensajes personalizadas. En lugar de modificar el código de aplicación, es posible que el usuario quiera aplicar determinadas transformaciones al mensaje en tiempo de ejecución (por ejemplo, para el control de versiones). Esto se puede lograr, de nuevo, con las interfaces del interceptor de mensajes.
Modelo de datos personalizado. Es posible que un usuario quiera tener un modelo de serialización o datos distinto de los admitidos de forma predeterminada en WCF (es decir, System.Runtime.Serialization.DataContractSerializer, System.Xml.Serialization.XmlSerializery System.ServiceModel.Channels.Message objetos). Esto se puede hacer mediante la implementación de las interfaces de formateador de mensajes. Para obtener más información, vea System.ServiceModel.Dispatcher.IClientMessageFormatter y la propiedad ClientOperation.Formatter.
Validación de parámetros personalizados. Es posible que un usuario prefiera asegurar que los parámetros tipados sean válidos, en contraste con XML. Esto se puede hacer mediante las interfaces del inspector de parámetros. Para obtener un ejemplo, vea Cómo: Inspeccionar o modificar parámetros ovalidación de cliente.
Uso de la clase ClientRuntime
La ClientRuntime clase es un punto de extensibilidad al que se pueden agregar objetos de extensión que interceptan mensajes y amplían el comportamiento del cliente. Los objetos de interceptación pueden procesar todos los mensajes de un contrato determinado, procesar solo los mensajes para determinadas operaciones, realizar la inicialización del canal personalizado e implementar otro comportamiento de aplicación cliente personalizada.
La propiedad CallbackDispatchRuntime devuelve el objeto en tiempo de ejecución de envío para los clientes de devolución de llamada iniciados por el servicio.
La OperationSelector propiedad acepta un objeto selector de operaciones personalizado.
La ChannelInitializers propiedad habilita la adición de un inicializador de canal que puede inspeccionar o modificar el canal de cliente.
La propiedad Operations obtiene una colección de los objetos ClientOperation a los que puede agregar interceptores personalizados de mensajes que proporcionan funcionalidad específica para los mensajes de esa operación.
La ManualAddressing propiedad permite a una aplicación desactivar algunos encabezados de direccionamiento automáticos para controlar directamente el direccionamiento.
La Via propiedad establece el valor del destino del mensaje en el nivel de transporte para admitir intermediarios y otros escenarios.
La MessageInspectors propiedad obtiene una colección de objetos IClientMessageInspector a los que puede agregar interceptores de mensajes personalizados para todos los mensajes que pasan por un cliente WCF.
Además, hay varias propiedades que recuperan la información del contrato:
Si el cliente WCF es un cliente WCF dúplex, las propiedades siguientes también recuperan la información del cliente WCF de devolución de llamada:
Para ampliar la ejecución del cliente WCF en todo un cliente WCF, revise las propiedades disponibles en la ClientRuntime clase para ver si modificar una propiedad o implementar una interfaz y agregarla a una propiedad crea la funcionalidad que busca. Una vez que haya elegido una extensión determinada para compilar, inserte la extensión en la propiedad adecuada ClientRuntime mediante la implementación de un comportamiento de cliente que proporcione acceso a la ClientRuntime clase cuando se invoque.
Puede insertar objetos de extensión personalizados en una colección mediante un comportamiento de operación (un objeto que implementa IOperationBehavior), un comportamiento de contrato (un objeto que implementa IContractBehavior) o un comportamiento de punto de conexión (un objeto que implementa IEndpointBehavior). El objeto de comportamiento de instalación se agrega a la colección adecuada de comportamientos mediante programación, mediante declaración (mediante la implementación de un atributo personalizado) o mediante la implementación de un objeto personalizado BehaviorExtensionElement para permitir que el comportamiento se inserte mediante un archivo de configuración de la aplicación. Para obtener más información, consulte Configuración y extensión del entorno de ejecución con comportamientos.
Para ver ejemplos que muestran la interceptación en un cliente WCF, vea Cómo: Inspeccionar o modificar mensajes en el cliente.
Uso de la clase ClientOperation
La ClientOperation clase es la ubicación para las modificaciones en tiempo de ejecución del cliente y el punto de inserción de extensiones personalizadas que tienen como ámbito solo una operación de servicio. (Para modificar el comportamiento en tiempo de ejecución del cliente para todos los mensajes de un contrato, use la ClientRuntime clase ).
Utilice la Operations propiedad para buscar el ClientOperation objeto que representa una operación de servicio determinada. Las siguientes propiedades permiten insertar objetos personalizados en el sistema cliente WCF:
Use la Formatter propiedad para insertar una implementación personalizada IClientMessageFormatter para una operación o modificar el formateador actual.
Utilice la ParameterInspectors propiedad para insertar una implementación personalizada IParameterInspector o para modificar la actual.
Las siguientes propiedades permiten modificar el sistema en interacción con el formateador y los inspectores de parámetros personalizados:
Utilice la SerializeRequest propiedad para controlar la serialización de un mensaje saliente.
Utilice la DeserializeReply propiedad para controlar la deserialización de un mensaje entrante.
Utilice la Action propiedad para controlar la acción WS-Addressing del mensaje de solicitud.
Utilice los BeginMethod y EndMethod para especificar qué métodos de cliente WCF están asociados a una operación asincrónica.
Use la propiedad FaultContractInfos para obtener una colección que contiene los tipos que pueden aparecer en errores de SOAP como tipo de detalle.
Use las propiedades IsInitiating y IsTerminating para controlar si una sesión se inicia o se anula, respectivamente, cuando se llama a la operación.
Utilice la IsOneWay propiedad para controlar si la operación es una operación unidireccional.
Utilice la Parent propiedad para obtener el objeto contenedor ClientRuntime .
Use la Name propiedad para obtener el nombre de la operación.
Utilice la SyncMethod propiedad para controlar qué método se asigna a la operación.
Para ampliar la ejecución del cliente WCF en una sola operación de servicio, revise las propiedades disponibles en la ClientOperation clase para ver si modifica una propiedad o implementa una interfaz y la agrega a una propiedad crea la funcionalidad que busca. Una vez que haya elegido una extensión determinada para compilar, inserte la extensión en la propiedad adecuada ClientOperation mediante la implementación de un comportamiento de cliente que proporcione acceso a la ClientOperation clase cuando se invoque. Dentro de ese comportamiento, puede modificar la ClientRuntime propiedad para que se ajuste a sus requisitos.
Normalmente, la implementación de un comportamiento de operación (un objeto que implementa la IOperationBehavior interfaz) basta, pero también puede usar comportamientos de punto de conexión y comportamientos de contrato para lograr lo mismo mediante la localización de OperationDescription para una operación determinada y adjuntar el comportamiento allí. Para obtener más información, consulte Configuración y extensión del entorno de ejecución con comportamientos.
Para usar tu comportamiento personalizado desde la configuración, instala tu comportamiento mediante un manejador de secciones de configuración de comportamiento personalizado. También puede instalar el comportamiento mediante la creación de un atributo personalizado.
Para obtener ejemplos que muestran la interceptación en un cliente WCF, vea Cómo: Inspeccionar o modificar parámetros.