Procédure : personnaliser une liaison fournie par le système

Windows Communication Foundation (WCF) inclut plusieurs liaisons fournies par le système qui vous permettent de configurer quelques-unes des propriétés des éléments de liaison sous-jacents, mais pas toutes les propriétés. Cette rubrique explique comment attribuer des propriétés aux éléments de liaison afin de créer une liaison personnalisée.

Pour plus d’informations sur la façon de créer et de configurer directement des éléments de liaison sans utiliser les liaisons fournies par le système, consultez Liaisons personnalisées.

Pour plus d’informations sur la création et l’extension de liaisons personnalisées, consultez Extension de liaisons.

Dans WCF, toutes les liaisons sont composées d’éléments de liaison. Chaque élément de liaison dérive de la classe BindingElement. Les liaisons fournies par le système telles que BasicHttpBinding créent et configurent leurs propres éléments de liaison. Cette rubrique vous indique comment accéder aux propriétés de ces éléments de liaison qui ne sont pas exposés directement sur la liaison et comment les modifier ; il s’agit, notamment, de la classe BasicHttpBinding.

Les éléments de liaison individuels sont inclus dans une collection représentée par la classe BindingElementCollection et sont ajoutés dans l’ordre suivant : Transaction Flow, Reliable Session, Security, Composite Duplex, One-way, Stream Security, Message Encoding et Transport. Notez que les éléments de liaison répertoriés ne sont pas tous requis dans chaque liaison. Les éléments de liaison définis par l’utilisateur peuvent également apparaître dans cette collection et doivent figurer dans le même ordre que précédemment. Par exemple, un transport défini par l'utilisateur doit être le dernier élément de la collection d'éléments de liaison.

La classe BasicHttpBinding contient trois éléments de liaison :

  1. Un élément de liaison de sécurité facultatif, soit la classe AsymmetricSecurityBindingElement utilisée avec le transport HTTP (sécurité de niveau transport), soit la classe TransportSecurityBindingElement utilisée lorsque la couche transport fournit la sécurité, auquel cas le transport HTTPS est utilisé.

  2. Un élément de liaison d'encodeur de message requis, TextMessageEncodingBindingElement ou MtomMessageEncodingBindingElement.

  3. Un élément de liaison de transport requis, HttpTransportBindingElement, ou HttpsTransportBindingElement.

Dans cet exemple nous allons créer une instance de la liaison, générer une liaison personnalisée à partir de là, examiner les éléments de liaison dans la liaison personnalisée et, lorsque nous aurons trouvé l’élément de liaison HTTP, affecter à sa propriété KeepAliveEnabled la valeur false. La propriété KeepAliveEnabled n’est pas exposée directement sur BasicHttpBinding, nous devons donc créer une liaison personnalisée pour naviguer jusqu’à l’élément de liaison et définir cette propriété.

Pour modifier une liaison fournie par le système

  1. Créez une instance de la classe BasicHttpBinding et affectez à son mode de sécurité la valeur de sécurité au niveau du message.

    //  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. Créez une liaison personnalisée à partir de la liaison et ensuite une classe BindingElementCollection à partir de l’une des propriétés de la liaison personnalisée.

    //  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. Parcourez la classe BindingElementCollection et lorsque vous trouverez la classe HttpTransportBindingElement, affectez à sa propriété KeepAliveEnabled la valeur 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
    

Voir aussi