Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Há várias maneiras de criar associações não fornecidas pelo sistema:
Crie uma associação personalizada, com base na CustomBinding classe, que é um contêiner que você preenche com elementos de associação. Em seguida, a vinculação personalizada é adicionada a um endpoint de serviço. Você pode criar a associação personalizada programaticamente ou em um arquivo de configuração de aplicativo. Para usar um elemento de associação de um arquivo de configuração de aplicativo, o elemento de associação deve estender BindingElementExtensionElement. Para obter mais informações sobre associações personalizadas, consulte Associações Personalizadas e CustomBinding.
Você pode criar uma classe que deriva de uma associação padrão. Por exemplo, você pode derivar uma classe de WSHttpBinding e substituir o método CreateBindingElements para obter os elementos de associação e inserir um elemento de associação personalizado ou estabelecer um valor específico para a segurança.
Você pode criar um novo Binding tipo para controlar completamente toda a implementação de associação.
A ordem dos elementos de associação
Cada elemento de associação representa uma etapa de processamento ao enviar ou receber mensagens. Durante a execução, os elementos de associação criam os canais e os escutadores necessários para construir pilhas de canais de saída e de entrada.
Há três tipos principais de elementos de associação: elementos de associação de protocolo, elementos de associação de codificação e elementos de associação de transporte.
Elementos de associação de protocolo – esses elementos representam etapas de processamento de nível superior que atuam em mensagens. Canais e ouvintes criados por esses elementos de associação podem adicionar, remover ou modificar o conteúdo da mensagem. Uma determinada associação pode ter um número arbitrário de elementos de associação de protocolo, cada um herdando de BindingElement. O WCF (Windows Communication Foundation) inclui vários elementos de associação de protocolo, incluindo o ReliableSessionBindingElementSymmetricSecurityBindingElement.
Elemento de associação de codificação – Esses elementos representam transformações entre uma mensagem e uma codificação pronta para transmissão pela rede. As ligações típicas do WCF incluem exatamente um elemento de ligação de codificação. Exemplos de elementos de associação de codificação incluem o MtomMessageEncodingBindingElement, o BinaryMessageEncodingBindingElemente o TextMessageEncodingBindingElement. Se um elemento de associação de codificação não for especificado para uma associação, uma codificação padrão será usada. O padrão é o texto quando o transporte for HTTP e binário, caso contrário.
Elemento de Ligação de Transporte – Esses elementos representam a transmissão de uma mensagem codificada em um protocolo de transporte. As associações típicas do WCF incluem exatamente um elemento de associação de transporte, que herda de TransportBindingElement. Exemplos de elementos de associação de transporte incluem o TcpTransportBindingElement, o HttpTransportBindingElemente o NamedPipeTransportBindingElement.
Ao criar novas associações, a ordem dos elementos de associação adicionados é importante. Sempre adicione elementos de associação na seguinte ordem:
| Camada | Opções | Obrigatório |
|---|---|---|
| Fluxo de Transação | 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 associação, se uma codificação não for especificada, o WCF adicionará uma codificação padrão para você. O padrão é Texto/XML para os transportes HTTP e HTTPS e Binário, caso contrário.
Criando um novo elemento de associação
Além dos tipos que são derivados de BindingElement e fornecidos pelo WCF, você também pode criar seus próprios elementos de associação. Isso permite personalizar a forma como a pilha de associações é criada e os componentes que entram nela criando seu BindingElement que pode ser composto com os outros tipos fornecidos pelo sistema na pilha.
Por exemplo, se você implementar um LoggingBindingElement que forneça a capacidade de registrar a mensagem em um banco de dados, deverá colocá-la acima de um canal de transporte na estrutura 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 você escreve seu novo elemento de associação depende da funcionalidade exata. Um dos exemplos, Transport: UDP, fornece uma descrição detalhada de como implementar um tipo de elemento de associação.
Criando uma nova associação
Um elemento de associação criado pelo usuário pode ser usado de duas maneiras. A seção anterior ilustra a primeira maneira: por meio de uma associação personalizada. Uma associação personalizada permite que o usuário crie sua própria associação com base em um conjunto arbitrário de elementos de associaçã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 a Binding. Isso evita criar manualmente uma associação personalizada sempre que você quiser usá-la. Uma associação definida pelo usuário permite que você defina o comportamento da associação e inclua elementos de associação definidos pelo usuário. Além disso, ela é pré-empacotada: você não precisa recompilar a associação toda vez que a usar.
No mínimo, uma associação definida pelo usuário deve implementar o CreateBindingElements método e a Scheme propriedade.
O método CreateBindingElements 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 associação de protocolo primeiro, seguidos do elemento de associação de codificação, seguido do elemento de associação de transporte. Ao usar os elementos de associação fornecidos pelo sistema WCF, você deve seguir as regras de ordenação de elemento de associação especificadas em Associações Personalizadas. Essa coleção nunca precisa referenciar objetos referenciados na classe de associação definida pelo usuário. Consequentemente, os autores da associação precisam retornar um Clone() da BindingElementCollection em cada chamada a CreateBindingElements.
A Scheme propriedade representa o esquema de URI para o protocolo de transporte em uso na associação. Por exemplo, o WSHttpBinding e o NetTcpBinding retornam "http" e "net.tcp" de suas respectivas 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 associação de perfil em SampleProfileUdpBinding, que deriva de Binding. O SampleProfileUdpBinding contém até quatro elementos de associação dentro dele: um criado pelo UdpTransportBindingElementusuário; e três fornecidos pelo sistema: TextMessageEncodingBindingElement, CompositeDuplexBindingElemente 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 em contratos de conexão duplex
Nem todos os elementos de associação são compatíveis uns com os outros. Em particular, há algumas restrições em elementos de associação de segurança quando usados com os contratos duplex.
Segurança de processo único
Você pode implementar a segurança "one-shot", em que todas as credenciais de segurança necessárias são enviadas em uma única mensagem, definindo o negotiateServiceCredential atributo do elemento de configuração de <mensagem> como false.
A autenticação de processo único não funciona com os contratos duplex.
Para contratos de solicitação-resposta, a autenticação de processo único funcionará se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IRequestChannel ou IRequestSessionChannel.
Para contratos unidirecionais, a autenticação de uso único funcionará se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IRequestChannel, IRequestSessionChannel, IOutputChannel ou IOutputSessionChannel.
Tokens de contexto de segurança do modo de cookie
Os tokens de contexto de segurança do modo de cookie não podem ser usados com os contratos duplex.
Para contratos de solicitação-resposta, os tokens de contexto de segurança do modo de cookie só funcionarão se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IRequestChannel ou IRequestSessionChannel.
Para contratos unidirecionais, os tokens de contexto de segurança do modo cookie funcionarão se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IRequestChannel ou IRequestSessionChannel.
Tokens de contexto de segurança do modo de sessão
O SCT do modo de sessão funcionará para contratos duplex se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IDuplexChannel ou IDuplexSessionChannel.
O SCT do modo de sessão funcionará para contratos de solicitação-resposta se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IDuplexChannel, IDuplexSessionChannel, IRequestChannel ou IRequestSessionChannel.
O SCT do modo de sessão funcionará para contratos unidirecionais se a pilha de associação abaixo do elemento de associação de segurança der suporte à criação de instâncias IDuplexChannel, IDuplexSessionChannel, IRequestChannel ou IRequestSessionChannel.
Como fazer a derivação de uma associação padrão
Em vez de criar uma classe de associação totalmente nova, talvez seja possível estender uma das associações existentes fornecidas pelo sistema. Assim como no caso anterior, você deve sobrescrever o método CreateBindingElements e a propriedade Scheme.