Vorgehensweise: Anpassen einer vom System bereitgestellten Bindung

Windows Communication Foundation (WCF) umfasst mehrere systemseitig bereitgestellte Bindungen, bei denen Sie einige der Eigenschaften von zugrundeliegenden Bindungselementen konfigurieren können. Es lassen sich jedoch nicht alle Eigenschaften konfigurieren. In diesem Thema wird veranschaulicht, wie Sie Eigenschaften für die Bindungselemente festlegen, um eine benutzerdefinierte Bindung zu erstellen.

Weitere Informationen zum direkten Erstellen und Konfigurieren von Bindungselementen ohne Verwendung der vom System bereitgestellten Bindungen finden Sie unter Benutzerdefinierte Bindungen.

Weitere Informationen zum Erstellen und Erweitern von benutzerdefinierten Bindungen finden Sie unter Erweitern von Bindungen.

In WCF bestehen alle Bindungen aus Bindungselementen. Jedes Bindungselement wird von der BindingElement-Klasse abgeleitet. Systemseitig bereitgestellte Bindungen wie BasicHttpBinding erstellen und konfigurieren ihre eigenen Bindungselemente. In diesem Thema wird gezeigt, wie Sie auf die Eigenschaften dieser Bindungselemente zugreifen und sie ändern können. Die Elemente sind nicht direkt über die Bindung verfügbar. Dies trifft insbesondere auf die BasicHttpBinding-Klasse zu.

Die einzelnen Bindungselemente sind in einer Auflistung enthalten, die von der BindingElementCollection-Klasse dargestellt wird, und werden in dieser Reihenfolge hinzugefügt: Transaktionsfluss, zuverlässige Sitzung, Sicherheit, Composite Duplex, Eindirektional, Streamsicherheit, Nachrichtencodierung und Transport. Beachten Sie, dass nicht alle aufgelisteten Bindungselemente in jeder Bindung erforderlich sind. Auch benutzerdefinierte Bindungselemente können in dieser Auflistung enthalten sein und müssen in der gerade beschriebenen Reihenfolge angezeigt werden. Zum Beispiel muss ein benutzerdefinierter Transport das letzte Element der Bindungselementeauflistung sein.

Die BasicHttpBinding-Klasse enthält drei Bindungselemente:

  1. Ein optionales Sicherheitsbindungselement, entweder die beim HTTP-Transport verwendete AsymmetricSecurityBindingElement-Klasse (Sicherheit auf Nachrichtenebene) oder die TransportSecurityBindingElement-Klasse, die verwendet wird, wenn die Transportschicht für die Sicherheit sorgt. In diesem Fall wird der HTTPS-Transport verwendet.

  2. Ein erforderliches Bindungselement zur Nachrichtencodierung, entweder TextMessageEncodingBindingElement oder MtomMessageEncodingBindingElement.

  3. Ein erforderliches Transportbindungselement, entweder HttpTransportBindingElement oder HttpsTransportBindingElement.

In diesem Beispiel werden eine Instanz der Bindung erstellt, eine benutzerdefinierte Bindung aus dieser Instanz generiert, die Bindungselemente der benutzerdefinierten Bindung untersucht und wenn das HTTP-Bindungselement gefunden wird, wird dessen KeepAliveEnabled-Eigenschaft auf false festgelegt. Die KeepAliveEnabled-Eigenschaft steht nicht direkt über die BasicHttpBinding zur Verfügung, sodass eine benutzerdefinierte Bindung erstellt werden muss, um zum Bindungselement zu navigieren und dessen Eigenschaft festzulegen.

So ändern Sie eine vom System bereitgestellte Bindung

  1. Erstellen Sie eine Instanz der BasicHttpBinding-Klasse und legen Sie ihren Sicherheitsmodus auf die Nachrichtenebene fest.

    //  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. Erstellen Sie eine benutzerdefinierte Bindung aus dieser Bindung, und erstellen Sie eine BindingElementCollection-Klasse aus einer der Eigenschaften der benutzerdefinierten Bindung.

    //  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. Durchlaufen Sie die BindingElementCollection-Klasse, und wenn Sie die HttpTransportBindingElement-Klasse gefunden haben, legen Sie deren KeepAliveEnabled-Eigenschaft auf false fest.

    //  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
    

Siehe auch