Freigeben über


Vorgehensweise: Anpassen einer Systembereitgestellten Bindung

Windows Communication Foundation (WCF) enthält mehrere vom System bereitgestellte Bindungen, mit denen Sie einige der Eigenschaften der zugrunde liegenden Bindungselemente konfigurieren können, aber nicht alle Eigenschaften. In diesem Thema wird veranschaulicht, wie Eigenschaften für die Bindungselemente festgelegt werden, 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 Custom Bindings.

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. Vom System bereitgestellte Bindungen, z. B. BasicHttpBinding, erstellen und konfigurieren ihre eigenen Bindungselemente. In diesem Thema wird erläutert, wie Sie auf die Eigenschaften dieser Bindungselemente zugreifen und diese ändern, die nicht direkt in der Bindung verfügbar sind, insbesondere die BasicHttpBinding Klasse.

Die einzelnen Bindungselemente sind in einer Sammlung enthalten, die durch die BindingElementCollection Klasse dargestellt wird und in dieser Reihenfolge hinzugefügt werden: Transaktionsfluss, zuverlässige Sitzung, Sicherheit, Composite Duplex, Unidirektionale, Stream-Sicherheit, Nachrichtencodierung und Transport. Beachten Sie, dass nicht alle aufgeführten Bindungselemente in jeder Bindung erforderlich sind. Benutzerdefinierte Bindungselemente können auch in dieser Bindungselementsammlung angezeigt werden und müssen in derselben Reihenfolge wie zuvor beschrieben angezeigt werden. Beispielsweise muss ein benutzerdefinierter Transport das letzte Element der Bindungselementauflistung sein.

Die BasicHttpBinding Klasse enthält drei Bindungselemente:

  1. Ein optionales Sicherheitsbindungselement: entweder die Klasse AsymmetricSecurityBindingElement, die mit dem HTTP-Transport verwendet wird (Sicherheit auf Nachrichtenebene), oder die Klasse TransportSecurityBindingElement, die eingesetzt wird, wenn die Transporteebene Sicherheit bietet. In diesem Fall wird der HTTPS-Transport genutzt.

  2. Ein erforderliches Nachrichtenencoder-Bindungselement, entweder TextMessageEncodingBindingElement oder MtomMessageEncodingBindingElement.

  3. Ein erforderliches Transportbindungselement, entweder HttpTransportBindingElementoder HttpsTransportBindingElement.

In diesem Beispiel erstellen wir eine Instanz der Bindung, generieren eine benutzerdefinierte Bindung daraus, untersuchen die Bindungselemente in der benutzerdefinierten Bindung, und wenn wir das HTTP-Bindungselement finden, legen wir dessen KeepAliveEnabled Eigenschaft auf false. Die KeepAliveEnabled Eigenschaft wird nicht direkt für das BasicHttpBindingObjekt verfügbar gemacht, daher müssen wir eine benutzerdefinierte Bindung erstellen, um zum Bindungselement zu navigieren und diese Eigenschaft festzulegen.

So ändern Sie eine vom System bereitgestellte Bindung

  1. Erstellen Sie eine Instanz der BasicHttpBinding Klasse, und legen Sie den Sicherheitsmodus auf 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 der 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 dessen KeepAliveEnabled Eigenschaft auf 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 = {httpElement.KeepAliveEnabled}");
            httpElement.KeepAliveEnabled = false;
            Console.WriteLine($"\tAfter:  HttpTransportBindingElement.KeepAliveEnabled = {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