Procedura: personalizzare un'associazione fornita dal sistema

Windows Communication Foundation include diverse associazioni fornite dal sistema che consentono di configurare alcune delle proprietà degli elementi di associazione sottostanti. In questo argomento viene illustrato come impostare proprietà sugli elementi di associazione per creare un'associazione personalizzata.

Per altre informazioni su come creare e configurare direttamente gli elementi di binding senza usare le associazioni fornite dal sistema, vedere Associazioni personalizzate.

Per altre informazioni sulla creazione e l'estensione di associazioni personalizzate, vedere Estensione delle associazioni.

In WCF tutte le associazioni sono costituite da elementi di binding. Ogni elemento di associazione deriva dalla classe BindingElement. Le associazioni fornite dal sistema, ad esempio BasicHttpBinding, creano e configurano propri elementi di associazione. In questo argomento viene illustrato come accedere e modificare le proprietà di questi elementi di associazione che non sono direttamente esposte sull'associazione; in particolare, la classe BasicHttpBinding.

I singoli elementi di associazione sono inclusi in una raccolta rappresentata dalla classe BindingElementCollection e vengono aggiunti nell'ordine seguente: Flusso delle transazioni, Sessione affidabile, Protezione, Duplex composito, Unidirezionale, Protezione di flusso, Codifica messaggi e Trasporto. Si noti che non tutti gli elementi di associazione elencati sono necessari in ogni associazione. In questa raccolta di elementi di associazione possono essere inclusi anche elementi di associazione definiti dall'utente, che devono essere visualizzati nello stesso ordine descritto in precedenza. Ad esempio, un trasporto definito dall'utente deve essere l'ultimo elemento della raccolta di elementi di associazione.

La classe BasicHttpBinding contiene tre elementi di associazione:

  1. Un elemento di associazione di sicurezza facoltativo: la classe AsymmetricSecurityBindingElement usata con il trasporto HTTP (protezione a livello di messaggio) o la classe TransportSecurityBindingElement usata quando il livello di trasporto fornisce la protezione, caso in cui viene usato il trasporto HTTPS.

  2. Un elemento di associazione del codificatore dei messaggi obbligatorio: TextMessageEncodingBindingElement o MtomMessageEncodingBindingElement.

  3. Un elemento di associazione del trasporto obbligatorio: HttpTransportBindingElement o HttpsTransportBindingElement.

In questo esempio viene creata un'istanza dell'associazione, da cui viene generata un'associazione personalizzata, vengono esaminati gli elementi di associazione nell'associazione personalizzata e, quando viene trovato l'elemento di associazione HTTP, viene impostata la proprietà KeepAliveEnabled su false. La proprietà KeepAliveEnabled non è esposta direttamente su BasicHttpBinding, pertanto è necessario creare un'associazione personalizzata per spostarsi verso il basso sull'elemento di associazione e impostare questa proprietà.

Per modificare un'associazione fornita dal sistema

  1. Creare un'istanza della classe BasicHttpBinding e impostarne la modalità di sicurezza a livello di messaggio.

    //  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. Creare un'associazione personalizzata dall'associazione e creare una classe BindingElementCollection da una delle proprietà dell'associazione personalizzata.

    //  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. Eseguire un ciclo nella classe BindingElementCollection e, quando viene trovata la classe HttpTransportBindingElement, impostarne la proprietà KeepAliveEnabled su 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
    

Vedi anche