Compartilhar via


Como: personalizar uma associação fornecida pelo sistema

O WCF (Windows Communication Foundation) inclui várias associações fornecidas pelo sistema que permitem configurar algumas das propriedades dos elementos de associação subjacentes, mas não todas as propriedades. Este tópico demonstra como definir propriedades nos elementos de associação para criar uma associação personalizada.

Para obter mais informações sobre como criar e configurar diretamente elementos de associação sem usar as associações fornecidas pelo sistema, consulte Associações Personalizadas.

Para obter mais informações sobre como criar e estender associações personalizadas, consulte Estendendo associações.

No WCF, todas as associações são compostas por elementos de associação. Cada elemento de associação deriva da classe BindingElement. Associações fornecidas pelo sistema, como BasicHttpBinding criar e configurar seus próprios elementos de associação. Este tópico mostra como acessar e alterar as propriedades desses elementos de associação, que não são expostos diretamente na associação, especificamente, a classe BasicHttpBinding.

Os elementos de associação individuais estão contidos em uma coleção representada pela classe BindingElementCollection e são adicionados nesta ordem: Fluxo de Transação, Sessão Confiável, Segurança, Duplex Composto, Unidirecional, Segurança de Fluxo, Codificação de Mensagens e Transporte. Observe que nem todos os elementos de associação listados são necessários em cada associação. Os elementos de associação definidos pelo usuário também podem aparecer nessa coleção de elementos de associação e precisam estar na mesma ordem descrita anteriormente. Por exemplo, um transporte definido pelo usuário precisa ser o último elemento da coleção de elementos de associação.

A classe BasicHttpBinding contém três elementos de associação:

  1. Um elemento de associação de segurança opcional, a classe AsymmetricSecurityBindingElement usada com o transporte HTTP (segurança no nível da mensagem) ou a classe TransportSecurityBindingElement, que usada quando a camada de transporte oferece segurança, nesse caso, o transporte HTTPS é usado.

  2. Um elemento de associação do codificador de mensagem obrigatório, TextMessageEncodingBindingElement ou MtomMessageEncodingBindingElement.

  3. Um elemento de associação de transporte obrigatório, HttpTransportBindingElement ou HttpsTransportBindingElement.

Neste exemplo, criamos uma instância da associação, geramos uma associação personalizada a partir dela, examinamos os elementos de associação na associação personalizada e, quando encontramos o elemento de associação HTTP, definimos sua propriedade KeepAliveEnabled como false. A propriedade KeepAliveEnabled não é exposta diretamente no BasicHttpBinding, portanto, precisamos criar uma associação personalizada para navegar até o elemento de associação e definir essa propriedade.

Para modificar uma associação fornecida pelo sistema

  1. Crie uma instância da classe BasicHttpBinding e defina seu modo de segurança como nível de mensagem.

    //  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. Crie uma associação personalizada a partir da associação e crie uma classe BindingElementCollection de uma das propriedades da associação personalizada.

    //  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. Faça loop pela classe BindingElementCollection e, quando encontrar a classe HttpTransportBindingElement, defina sua propriedade KeepAliveEnabled como 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
    

Confira também