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.
Los comportamientos permiten modificar el comportamiento predeterminado y agregar extensiones personalizadas que inspeccionan y validan la configuración del servicio o modifican el comportamiento en tiempo de ejecución en las aplicaciones cliente y servicio de Windows Communication Foundation (WCF). En este tema se describen las interfaces de comportamiento, cómo implementarlas y cómo agregarlas a la descripción del servicio (en una aplicación de servicio) o punto de conexión (en una aplicación cliente) mediante programación o en un archivo de configuración. Para obtener más información sobre el uso de comportamientos proporcionados por el sistema, vea Especificar el comportamiento de Run-Time del servicio y especificar el comportamiento de Run-Time cliente.
Comportamientos
Los tipos de comportamiento se agregan a los objetos de descripción del punto de conexión de servicio o servicio (en el servicio o cliente, respectivamente) antes de que Windows Communication Foundation (WCF) use esos objetos para crear un entorno de ejecución que ejecute un servicio WCF o un cliente WCF. Cuando se llama a estos comportamientos durante el proceso de construcción en tiempo de ejecución, podrá tener acceso a las propiedades y métodos en tiempo de ejecución que modifican el tiempo de ejecución construido por el contrato, enlaces y direcciones.
Métodos de comportamiento
Todos los comportamientos tienen un AddBindingParameters
método, un ApplyDispatchBehavior
método, un Validate
método y un ApplyClientBehavior
método con una excepción: dado que IServiceBehavior no se puede ejecutar en un cliente, no implementa ApplyClientBehavior
.
Utilice el método
AddBindingParameters
para modificar o agregar los objetos personalizados a una colección a la que los enlaces personalizados pueden tener acceso para su uso cuando se construya el tiempo de ejecución. Por ejemplo, esta forma en que se especifican los requisitos de protección que afectan a la forma en que se compila el canal, pero que el desarrollador del canal no conoce.Use el
Validate
método para examinar el árbol de descripción y el objeto en tiempo de ejecución correspondiente para asegurarse de que se ajusta a algún conjunto de criterios.Use los
ApplyDispatchBehavior
métodos yApplyClientBehavior
para examinar el árbol de descripción y modificar el tiempo de ejecución para un ámbito determinado en el servicio o en el cliente. También puede insertar objetos de extensión.Nota:
Aunque se proporciona un árbol de descripción en estos métodos, es solo para examinación. Si se modifica un árbol de descripción, el comportamiento no está definido.
Las propiedades que puede modificar y las interfaces de personalización que puede implementar se acceden a través de las clases de tiempo de ejecución de cliente y servicio. Los tipos de servicio son las clases DispatchRuntime y DispatchOperation. Los tipos de cliente son las clases ClientRuntime y ClientOperation. Las clases ClientRuntime y DispatchRuntime son los puntos de entrada para la extensibilidad, permitiendo el acceso a las propiedades de tiempo de ejecución y las colecciones de extensiones, tanto a nivel de cliente como de servicio, respectivamente. Del mismo modo, las clases ClientOperation y DispatchOperation exponen, respectivamente, las propiedades del entorno de ejecución de operaciones de cliente y de operaciones de servicio, así como las colecciones de extensiones. Sin embargo, puede acceder al objeto de tiempo de ejecución con alcance más amplio desde el objeto de tiempo de ejecución de la operación y viceversa si es necesario.
Nota:
Para obtener una explicación de las propiedades en tiempo de ejecución y los tipos de extensión que puede usar para modificar el comportamiento de ejecución de un cliente, consulte Extensión de clientes. Para obtener una explicación sobre las propiedades en tiempo de ejecución y los tipos de extensión que pueden usarse para modificar el comportamiento de ejecución de un distribuidor de servicios, consulte Extensión de distribuidores.
La mayoría de los usuarios de WCF no interactúan directamente con el tiempo de ejecución; en su lugar, usan construcciones de modelo de programación principales, como puntos de conexión, contratos, enlaces, direcciones y atributos de comportamiento en clases o comportamientos en archivos de configuración. Estas construcciones componen el árbol de descripción, que es la especificación completa para construir un entorno de ejecución para admitir un servicio o cliente descrito por el árbol de descripción.
Hay cuatro tipos de comportamientos en WCF:
Los comportamientos de servicio (IServiceBehavior tipos) permiten la personalización de todo el tiempo de ejecución del servicio, incluido ServiceHostBase.
Los comportamientos de punto de conexión (IEndpointBehavior tipos) permiten la personalización de los puntos de conexión de servicio y sus objetos asociados EndpointDispatcher .
Los comportamientos de contrato (IContractBehavior tipos) permiten la personalización de las clases ClientRuntime y DispatchRuntime en las aplicaciones de cliente y servicio, respectivamente.
Los comportamientos de la operación (tipos IOperationBehavior) permiten la personalización de las clases ClientOperation y DispatchOperation, de nuevo, en el cliente y el servicio.
Puede agregar estos comportamientos a los distintos objetos de descripción mediante la implementación de atributos personalizados, mediante archivos de configuración de la aplicación o directamente agregándolos a la colección behaviors en el objeto de descripción adecuado. Sin embargo, deben agregarse a la descripción del servicio o a un objeto de descripción del punto de conexión del servicio antes de llamar a ICommunicationObject.Open en ServiceHost o ChannelFactory<TChannel>.
Ámbitos de comportamiento
Hay cuatro tipos de comportamiento, cada uno de los cuales corresponde a un ámbito determinado de acceso en tiempo de ejecución.
Comportamientos de servicio
Los comportamientos del servicio, que implementan IServiceBehavior, son el mecanismo principal por el que se modifica todo el tiempo de ejecución del servicio. Hay tres mecanismos para agregar comportamientos de servicio a un servicio.
Uso de un atributo en la clase de servicio. Cuando se construye un ServiceHost, la implementación de ServiceHost usa la reflexión para detectar el conjunto de atributos en el tipo de servicio. Si cualquiera de esos atributos son implementaciones de IServiceBehavior, se agregan a la colección de comportamientos en ServiceDescription. Esto permite que esos comportamientos participen en la construcción del tiempo de ejecución del servicio.
Agregar mediante programación el comportamiento a la colección de comportamientos en ServiceDescription. Esto se puede lograr con las siguientes líneas de código:
ServiceHost host = new ServiceHost(/* Parameters */); host.Description.Behaviors.Add(/* Service Behavior */);
Implementación de un elemento personalizado BehaviorExtensionElement que amplía la configuración. Esto permite el uso de las características del servicio desde los archivos de configuración de la aplicación.
Entre los ejemplos de comportamientos de servicio de WCF se incluyen el comportamiento ServiceBehaviorAttribute, el ServiceThrottlingBehavior y el comportamiento ServiceMetadataBehavior.
Comportamientos de contrato
Los comportamientos del contrato, que implementan la IContractBehavior interfaz, se usan para ampliar tanto el tiempo de ejecución del cliente como del servicio a través de un contrato.
Hay dos mecanismos para agregar comportamientos de contrato a un contrato. El primer mecanismo consiste en crear un atributo personalizado que se usará en la interfaz de contrato. Cuando se pasa una interfaz de contrato a un ServiceHost o a un ChannelFactory<TChannel>, WCF examina los atributos de la interfaz. Si algún atributo es implementaciones de IContractBehavior, se agregan a la colección de comportamientos en el System.ServiceModel.Description.ContractDescription creado para esa interfaz.
También puede implementar System.ServiceModel.Description.IContractBehaviorAttribute en el atributo de comportamiento de contrato personalizado. En este caso, el comportamiento es el siguiente cuando se aplica a:
•Una interfaz de contrato. En este caso, el comportamiento se aplica a todos los contratos de ese tipo en cualquier punto de conexión y WCF omite el valor de la IContractBehaviorAttribute.TargetContract propiedad.
•Una clase de servicio. En este caso, el comportamiento solo se aplica a los puntos de conexión cuyo contrato es el valor de la propiedad TargetContract.
•Una clase de devolución de llamada. En este caso, el comportamiento se aplica al punto de conexión del cliente dúplex y WCF omite el valor de la propiedad TargetContract.
El segundo mecanismo consiste en agregar el comportamiento a la colección de comportamientos en un ContractDescription.
Algunos ejemplos de comportamientos de contrato en WCF incluyen el System.ServiceModel.DeliveryRequirementsAttribute atributo . Para obtener más información y un ejemplo, vea el tema de referencia.
Comportamientos de punto de conexión
Los comportamientos de punto de conexión, que implementan IEndpointBehavior, son el mecanismo principal por el que se modifica todo el servicio o el tiempo de ejecución del cliente para un punto de conexión específico.
Hay dos mecanismos para agregar comportamientos de punto de conexión a un servicio.
Agregue el comportamiento a la Behaviors propiedad .
Implemente un BehaviorExtensionElement personalizado que extienda la configuración.
Para obtener más información y un ejemplo, vea el tema de referencia.
Comportamientos de la operación
Los comportamientos de operación, que implementan la IOperationBehavior interfaz, se usan para ampliar tanto el tiempo de ejecución del cliente como del servicio para cada operación.
Hay dos mecanismos para agregar comportamientos de operación a una operación. El primer mecanismo consiste en crear un atributo personalizado que se usará en el método que modela la operación. Cuando se agrega una operación a un ServiceHost o un ChannelFactory, WCF agrega cualquier atributo IOperationBehavior a la colección de comportamientos de la OperationDescription creada para esa operación.
El segundo mecanismo consiste en agregar directamente el comportamiento a la colección de comportamientos en un OperationDescription construido.
Entre los ejemplos de comportamientos de operación de WCF se incluyen el OperationBehaviorAttribute y el TransactionFlowAttribute.
Para obtener más información y un ejemplo, vea el tema de referencia.
Uso de la configuración para crear comportamientos
El servicio y el punto de conexión, y los comportamientos de contrato pueden diseñarse para especificarse en el código o mediante atributos; solo los comportamientos de servicio y punto de conexión se pueden configurar mediante archivos de configuración web o de aplicación. Exponer comportamientos mediante atributos permite a los desarrolladores especificar un comportamiento en tiempo de compilación que no se puede agregar, quitar ni modificar en tiempo de ejecución. Esto suele ser adecuado para comportamientos que siempre son necesarios para el funcionamiento correcto de un servicio (por ejemplo, los parámetros relacionados con la transacción con el System.ServiceModel.ServiceBehaviorAttribute atributo). Exponer comportamientos mediante la configuración permite a los desarrolladores dejar la especificación y configuración de esos comportamientos a los que implementan el servicio. Esto es adecuado para comportamientos que son componentes opcionales u otra configuración específica de la implementación, como si los metadatos se exponen para el servicio o la configuración de autorización determinada para un servicio.
Nota:
También puede utilizar comportamientos que admiten la configuración para exigir las directivas de aplicación de la empresa insertándolas en el archivo de configuración machine.config y bloqueando esos elementos. Para obtener una descripción y un ejemplo, vea Cómo: Bloquear puntos de conexión en la empresa.
Para exponer un comportamiento mediante la configuración, un desarrollador debe crear una clase derivada de BehaviorExtensionElement y, a continuación, registrar esa extensión con la configuración.
En el siguiente ejemplo de código se muestra cómo IEndpointBehavior implementa BehaviorExtensionElement:
// BehaviorExtensionElement members
public override Type BehaviorType
{
get { return typeof(EndpointBehaviorMessageInspector); }
}
protected override object CreateBehavior()
{
return new EndpointBehaviorMessageInspector();
}
Para que el sistema de configuración cargue un BehaviorExtensionElement personalizado, se debe registrar como una extensión. En el ejemplo de código siguiente se muestra el archivo de configuración para el comportamiento del punto de conexión anterior:
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metadataSupport"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/ServiceMetadata" />
</baseAddresses>
</host>
<endpoint
address="/SampleService"
binding="wsHttpBinding"
behaviorConfiguration="withMessageInspector"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="withMessageInspector">
<endpointMessageInspector />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="endpointMessageInspector"
type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Donde Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector
es el tipo de extensión de comportamiento y HostApplication
es el nombre del ensamblado en el que se ha compilado esa clase.
Orden de evaluación
El System.ServiceModel.ChannelFactory<TChannel> y el System.ServiceModel.ServiceHost son responsables de construir el tiempo de ejecución a partir del modelo de programación y la descripción. Los comportamientos, como se describió anteriormente, contribuyen a ese proceso de compilación en el servicio, el punto de conexión, el contrato y la operación.
ServiceHost Aplica comportamientos en el orden siguiente:
Servicio
Contrato
Punto final
Operación
Dentro de cualquier colección de comportamientos, no se garantiza ningún orden.
ChannelFactory<TChannel> Aplica comportamientos en el orden siguiente:
Contrato
Punto final
Operación
Dentro de cualquier colección de comportamientos, de nuevo, no se garantiza ningún orden.
Agregar comportamientos mediante programación
Las propiedades de System.ServiceModel.Description.ServiceDescription en la aplicación de servicio no se deben modificar después del método de CommunicationObject.OnOpening en System.ServiceModel.ServiceHostBase. Algunos miembros, como la ServiceHostBase.Credentials propiedad y los AddServiceEndpoint
métodos de ServiceHostBase y System.ServiceModel.ServiceHost, producen una excepción si se modifican más allá de ese punto. Otros le permiten modificarlos, pero el resultado no está definido.
De igual forma, en el cliente no se deben modificar los valores System.ServiceModel.Description.ServiceEndpoint después de la llamada a OnOpening en System.ServiceModel.ChannelFactory. La ChannelFactory.Credentials propiedad produce una excepción si se modifica más allá de ese punto, pero los demás valores de descripción del cliente se pueden modificar sin errores. Sin embargo, el resultado no está definido.
Tanto para el servicio como para el cliente, se recomienda modificar la descripción antes de llamar a CommunicationObject.Open.
Reglas de herencia para atributos de comportamiento
Los cuatro tipos de comportamientos se pueden rellenar mediante atributos: comportamientos de servicio y comportamientos de contrato. Dado que los atributos se definen en los objetos y miembros administrados, y los objetos administrados y los miembros admiten la herencia, es necesario definir cómo funcionan los atributos de comportamiento en el contexto de la herencia.
En un nivel alto, la regla es que para un ámbito determinado (por ejemplo, servicio, contrato o operación), se aplican todos los atributos de comportamiento de la jerarquía de herencia para ese ámbito. Si hay dos atributos de comportamiento del mismo tipo, solo se usa el tipo más derivado.
Comportamientos de servicio
Para una clase de servicio determinada, se aplican todos los atributos de comportamiento de servicio en esa clase y en los padres de esa clase. Si se aplica el mismo tipo de atributo en varios lugares de la jerarquía de herencia, se usa el tipo más derivado.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirementsAttribute(
AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class A { /* … */ }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class B : A { /* … */}
Por ejemplo, en el caso anterior, el servicio B finaliza con un InstanceContextMode de Single, un modo AspNetCompatibilityRequirementsMode de Allowed y un ConcurrencyMode de Single. ConcurrencyMode es Single, porque el atributo ServiceBehaviorAttribute en el servicio B está "más derivado" que en el servicio A.
Comportamientos de contrato
Para un contrato determinado, se aplicarán todos los atributos de comportamiento de contrato en esa interfaz y en los elementos primarios de esa interfaz. Si se aplica el mismo tipo de atributo en varios lugares de la jerarquía de herencia, se usa el tipo más derivado.
Comportamientos de la operación
Si una operación determinada no invalida una operación abstracta o virtual existente, no se aplicará ninguna regla de herencia.
Si una operación invalida una operación existente, se aplican todos los atributos de comportamiento de la operación en esa operación y en los elementos primarios de esa operación. Si se aplica el mismo tipo de atributo en varios lugares de la jerarquía de herencia, se usa el tipo más derivado.