Procedimiento para personalizar un enlace proporcionado por el sistema

Windows Communication Foundation (WCF) incluye varios enlaces proporcionados por el sistema que le permiten configurar algunas de las propiedades de los elementos de enlace subyacentes. En este tema se muestra cómo establecer las propiedades en los elementos de enlace para crear un enlace personalizado.

Para más información sobre cómo crear y configurar directamente elementos de enlace sin utilizar los enlaces proporcionados por el sistema, consulte Enlaces personalizados.

Para más información sobre cómo crear y extender enlaces personalizados, consulte Extensión de enlaces.

En WCF, todos los enlaces se componen de elementos de enlace. Cada elemento de enlace deriva de la clase BindingElement. Los enlaces proporcionados por el sistema, como BasicHttpBinding crean y configuran sus propios elementos de enlace. En este tema se muestra cómo obtener acceso y cambiar las propiedades de estos elementos de enlace, que no se exponen directamente en el enlace; en concreto, la clase BasicHttpBinding.

Los elementos de enlace individuales se incluyen en una colección representada por la clase BindingElementCollection y se agregan en este orden: flujo de la transacción, sesión confiable, seguridad, dúplex compuesto, unidireccional, seguridad de secuencia, codificación de mensajes y transporte. Tenga en cuenta que no todos los elementos de enlace enumerados se necesitan en cada enlace. Los elementos de enlace definidos por el usuario pueden aparecer también en esta colección de elementos de enlace y deben aparecer en el orden descrito anteriormente. Por ejemplo, un transporte definido por el usuario debe ser el último elemento de la colección de elementos de enlace.

La clase BasicHttpBinding contiene tres elementos de enlace:

  1. Un elemento de enlace de seguridad opcional, la clase AsymmetricSecurityBindingElement utilizada con el transporte HTTP (seguridad de mensajes) o la clase TransportSecurityBindingElement, que se utiliza cuando el nivel de transporte proporciona seguridad, en cuyo caso se utiliza el transporte de HTTPS.

  2. Un elemento de enlace del codificador de mensajes requerido, TextMessageEncodingBindingElement o MtomMessageEncodingBindingElement.

  3. Un elemento de enlace del transporte requerido, o HttpTransportBindingElement, o HttpsTransportBindingElement.

En este ejemplo creamos una instancia del enlace, generamos un enlace personalizado a partir de él, examinamos los elementos de enlace del enlace personalizado y, cuando encontramos el elemento de enlace HTTP, establecemos su propiedad KeepAliveEnabled en false. La propiedad KeepAliveEnabled no se expone directamente en BasicHttpBinding, por lo que debemos crear un enlace personalizado para explorar hacia abajo hasta el elemento de enlace y establecer esta propiedad.

Modificación de un enlace proporcionado por el sistema

  1. Cree una instancia de la clase BasicHttpBinding y establezca su modo de seguridad en el nivel de mensaje.

    //  Create an instance of the T:System.ServiceModel.BasicHttpBinding
    //  class and set its security mode to message-level security.
    BasicHttpBinding binding = new BasicHttpBinding();
    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
    binding.Security.Mode = BasicHttpSecurityMode.Message;
    
    '  Create an instance of the T:System.ServiceModel.BasicHttpBinding 
    '  class and set its security mode to message-level security.
    Dim binding As New BasicHttpBinding()
    With binding.Security
        .Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate
        .Mode = BasicHttpSecurityMode.Message
    End With
    
  2. Cree un enlace personalizado a partir del enlace y cree una clase BindingElementCollection a partir de una de las propiedades del enlace personalizado.

    //  Create a custom binding from the binding
    CustomBinding cb = new CustomBinding(binding);
    //  Get the BindingElementCollection from this custom binding
    BindingElementCollection bec = cb.Elements();
    
    '  Create a custom binding from the binding 
    Dim cb As New CustomBinding(binding)
    '  Get the BindingElementCollection from this custom binding 
    Dim bec = cb.Elements
    
  3. Recorra a través de la clase BindingElementCollection y cuando encuentre la clase HttpTransportBindingElement, establezca su propiedad KeepAliveEnabled en false.

    //  Loop through the collection, and when you find the HTTP binding element
    //  set its KeepAliveEnabled property to false
    foreach (BindingElement be in bec)
    {
        Type thisType = be.GetType();
        Console.WriteLine(thisType);
        if (be is HttpTransportBindingElement)
        {
            HttpTransportBindingElement httpElement = (HttpTransportBindingElement)be;
            Console.WriteLine("\tBefore: HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled);
            httpElement.KeepAliveEnabled = false;
            Console.WriteLine("\tAfter:  HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled);
        }
    }
    
    '  Loop through the collection, and when you find the HTTP binding element
    '  set its KeepAliveEnabled property to false
    For Each be In bec
        Dim thisType = be.GetType()
        Console.WriteLine(thisType)
        If TypeOf be Is HttpTransportBindingElement Then
            Dim httpElement As HttpTransportBindingElement = CType(be, HttpTransportBindingElement)
            Console.WriteLine(Constants.vbTab & "Before: HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled)
            httpElement.KeepAliveEnabled = False
            Console.WriteLine(vbTab & "After:  HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled)
        End If
    Next be
    

Consulte también