Partilhar via


Criando ligações definidas pelo usuário

Há várias maneiras de criar ligações não fornecidas pelo sistema:

  • Crie uma associação personalizada, com base na classe, que é um contêiner que você preenche CustomBinding com elementos de ligação. A associação personalizada é então adicionada a um ponto de extremidade de serviço. Você pode criar a associação personalizada programaticamente ou em um arquivo de configuração do aplicativo. Para usar um elemento binding de um arquivo de configuração do aplicativo, o elemento binding deve estender BindingElementExtensionElemento . Para obter mais informações sobre ligações personalizadas, consulte Ligações personalizadas e CustomBinding.

  • Você pode criar uma classe que deriva de uma associação padrão. Por exemplo, você pode derivar uma classe e substituir CreateBindingElements o método para obter os elementos de vinculação e inserir um elemento de WSHttpBinding vinculação personalizado ou estabelecer um valor específico para segurança.

  • Você pode criar um novo Binding tipo para controlar completamente toda a implementação de vinculação.

A ordem dos elementos vinculativos

Cada elemento de vinculação representa uma etapa de processamento ao enviar ou receber mensagens. Em tempo de execução, os elementos de ligação criam os canais e ouvintes necessários para construir pilhas de canais de entrada e saída.

Existem três tipos principais de elementos de ligação: Elementos de ligação de protocolo, Elementos de ligação de codificação e Elementos de ligação de transporte.

Elementos de vinculação de protocolo – Esses elementos representam etapas de processamento de nível superior que atuam nas mensagens. Os canais e ouvintes criados por esses elementos de vinculação podem adicionar, remover ou modificar o conteúdo da mensagem. Uma determinada ligação pode ter um número arbitrário de elementos de ligação de protocolo, cada um herdando de BindingElement. O Windows Communication Foundation (WCF) inclui vários elementos de vinculação de protocolo, incluindo o ReliableSessionBindingElement e o SymmetricSecurityBindingElement.

Encoding Binding Element – Estes elementos representam transformações entre uma mensagem e uma codificação pronta para transmissão no fio. As ligações típicas do WCF incluem exatamente um elemento de vinculação de codificação. Exemplos de elementos de ligação de codificação incluem o MtomMessageEncodingBindingElement, o BinaryMessageEncodingBindingElemente o TextMessageEncodingBindingElement. Se um elemento de vinculação de codificação não for especificado para uma ligação, uma codificação padrão será usada. O padrão é texto quando o transporte é HTTP e binário caso contrário.

Elemento de vinculação de transporte – Esses elementos representam a transmissão de uma mensagem de codificação em um protocolo de transporte. As ligações típicas do WCF incluem exatamente um elemento de ligação de transporte, que herda do TransportBindingElement. Exemplos de elementos de ligação de transporte incluem o TcpTransportBindingElement, o , e HttpTransportBindingElemento NamedPipeTransportBindingElement.

Ao criar novas associações, a ordem dos elementos de vinculação adicionados é importante. Adicione sempre elementos de ligação pela seguinte ordem:

Camada Opções Necessário
Fluxo de transações System.ServiceModel.Channels.TransactionFlowBindingElement Não
Fiabilidade System.ServiceModel.Channels.ReliableSessionBindingElement Não
Segurança System.ServiceModel.Channels.SecurityBindingElement Não
Duplex composto System.ServiceModel.Channels.CompositeDuplexBindingElement Não
Codificação Texto, binário, MTOM, personalizado Sim*
Transporte TCP, pipes nomeados, HTTP, HTTPS, MSMQ, Personalizado Sim

*Como uma codificação é necessária para cada ligação, se uma codificação não for especificada, o WCF adicionará uma codificação padrão para você. O padrão é Text/XML para os transportes HTTP e HTTPS e Binary caso contrário.

Criando um novo elemento de vinculação

Além dos tipos derivados que são fornecidos pelo WCF, você pode criar seus próprios elementos de BindingElement ligação. Isso permite que você personalize a maneira como a pilha de ligações é criada e os componentes que entram nela, criando o seu próprio BindingElement que pode ser composto com os outros tipos fornecidos pelo sistema na pilha.

Por exemplo, se você implementar um LoggingBindingElement que fornece a capacidade de registrar a mensagem em um banco de dados, você deve colocá-lo acima de um canal de transporte na pilha de canais. Nesse caso, o aplicativo cria uma associação personalizada que compôs o LoggingBindingElement com TcpTransportBindingElement, como no exemplo a seguir.

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

A forma como escreve o novo elemento de ligação depende da sua funcionalidade exata. Um dos exemplos, Transport: UDP, fornece uma descrição detalhada de como implementar um tipo de elemento de ligação.

Criando uma nova vinculação

Um elemento de vinculação criado pelo usuário pode ser usado de duas maneiras. A seção anterior ilustra a primeira maneira: através de uma vinculação personalizada. Uma associação personalizada permite que o usuário crie sua própria vinculação com base em um conjunto arbitrário de elementos de ligação, incluindo os criados pelo usuário.

Se você usar a associação em mais de um aplicativo, crie sua própria associação e estenda o Binding. Isso evita a criação manual de uma associação personalizada sempre que você quiser usá-la. Uma associação definida pelo usuário permite definir o comportamento da associação e incluir elementos de vinculação definidos pelo usuário. E é pré-embalado: você não precisa reconstruir a encadernação toda vez que usá-la.

No mínimo, uma associação definida pelo usuário deve implementar o método e a CreateBindingElementsScheme propriedade.

O CreateBindingElements método retorna um novo BindingElementCollection que contém os elementos de ligação para a ligação. A coleção é ordenada e deve conter os elementos de ligação de protocolo primeiro, seguidos pelo elemento de ligação de codificação, seguido pelo elemento de ligação de transporte. Ao usar os elementos de vinculação fornecidos pelo sistema WCF, você deve seguir as regras de ordenação de elementos de vinculação especificadas em Ligações personalizadas. Essa coleção nunca deve fazer referência a objetos referenciados dentro da classe de vinculação definida pelo usuário; consequentemente, os BindingElementCollection autores vinculados devem retornar um Clone() dos em cada chamada para CreateBindingElements.

A Scheme propriedade representa o esquema de URI para o protocolo de transporte em uso na ligação. Por exemplo, o WSHttpBinding e o NetTcpBinding retornam "http" e "net.tcp" de suas respetivas Scheme propriedades.

Para obter uma lista completa de métodos e propriedades opcionais para associações definidas pelo usuário, consulte Binding.

Exemplo

Este exemplo implementa a vinculação de perfil em SampleProfileUdpBinding, que deriva de Binding. O SampleProfileUdpBinding contém até quatro elementos de ligação dentro dele: um criado pelo UdpTransportBindingElementusuário e três fornecidos pelo sistema: TextMessageEncodingBindingElement, CompositeDuplexBindingElement, e ReliableSessionBindingElement.

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

Restrições de segurança com contratos duplex

Nem todos os elementos de ligação são compatíveis entre si. Em particular, existem algumas restrições sobre elementos vinculativos de segurança quando usados com contratos duplex.

Segurança One-Shot

Você pode implementar a segurança "one-shot", onde todas as credenciais de segurança necessárias são enviadas em uma única mensagem, definindo o negotiateServiceCredential<atributo do elemento de configuração da mensagem> como false.

A autenticação one-shot não funciona com contratos duplex.

Para contratos de Solicitação-Resposta, a autenticação one-shot funciona somente se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação IRequestChannel ou IRequestSessionChannel instâncias.

Para contratos unidirecionais, a autenticação one-shot funciona se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação IRequestChannelde , IRequestSessionChannelIOutputChannel ou IOutputSessionChannel instâncias.

Os tokens de contexto de segurança do modo cookie não podem ser usados com contratos duplex.

Para contratos Request-Answer, os tokens de contexto de segurança de modo cookie funcionam somente se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação IRequestChannel de instâncias OR IRequestSessionChannel .

Para contratos unidirecionais, os tokens de contexto de segurança no modo cookie funcionam se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação IRequestChannel ou IRequestSessionChannel instâncias.

Tokens de contexto de segurança no modo de sessão

O SCT do modo de sessão funciona para contratos duplex se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação IDuplexChannel ou IDuplexSessionChannel instâncias.

O SCT do modo de sessão funciona para contratos de Solicitação-Resposta se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação de IDuplexChannelinstâncias , IDuplexSessionChannelIRequestChannel ou IRequestSessionChannel, .

O SCT no modo de sessão funciona para contratos de 1 via se a pilha de vinculação abaixo do elemento de vinculação de segurança suportar a criação IDuplexChannelde , IDuplexSessionChannelIRequestChannel ou IRequestSessionChannel instâncias.

Derivando de uma vinculação padrão

Em vez de criar uma classe de vinculação totalmente nova, talvez seja possível estender uma das associações fornecidas pelo sistema existentes. Assim como no caso anterior, você deve substituir o CreateBindingElements método e a Scheme propriedade.

Consulte também