Como: Personalizar uma vinculação fornecida pelo sistema
O Windows Communication Foundation (WCF) inclui várias associações fornecidas pelo sistema que permitem configurar algumas das propriedades dos elementos de ligação subjacentes, mas não todas as propriedades. Este tópico demonstra como definir propriedades nos elementos de vinculação para criar uma associação personalizada.
Para obter mais informações sobre como criar e configurar diretamente elementos de vinculação sem usar as associações fornecidas pelo sistema, consulte Ligações personalizadas.
Para obter mais informações sobre como criar e estender ligações personalizadas, consulte Estendendo ligações.
No WCF, todas as ligações são compostas por elementos de ligação. Cada elemento de ligação deriva da BindingElement classe. Ligações fornecidas pelo sistema, como BasicHttpBinding criar e configurar seus próprios elementos de ligação. Este tópico mostra como acessar e alterar as propriedades desses elementos de ligação, que não são expostos diretamente na associação; especificamente, a BasicHttpBinding classe.
Os elementos de vinculação individuais estão contidos em uma coleção representada pela BindingElementCollection classe e são adicionados nesta ordem: Fluxo de Transações, Sessão Confiável, Segurança, Duplex Composto, One-way, Segurança de Fluxo, Codificação de Mensagens e Transporte. Observe que nem todos os elementos de vinculação listados são necessários em todas as associações. Os elementos de vinculação definidos pelo usuário também podem aparecer nessa coleção de elementos de vinculação e devem aparecer na mesma ordem descrita anteriormente. Por exemplo, um transporte definido pelo usuário deve ser o último elemento da coleção de elementos de ligação.
A BasicHttpBinding classe contém três elementos de ligação:
Um elemento de vinculação de segurança opcional, a AsymmetricSecurityBindingElement classe usada com o transporte HTTP (segurança no nível da mensagem) ou a TransportSecurityBindingElement classe, que é usada quando a camada de transporte fornece segurança, caso em que o transporte HTTPS é usado.
Um elemento de vinculação do codificador de mensagens necessário, ou TextMessageEncodingBindingElement MtomMessageEncodingBindingElement.
Um elemento de ligação de transporte necessário, ou HttpTransportBindingElement, ou HttpsTransportBindingElement.
Neste exemplo, criamos uma instância da ligação, geramos uma associação personalizada a partir dela, examinamos os elementos de ligação na associação personalizada e, quando encontramos o elemento de vinculação HTTP, definimos sua KeepAliveEnabled
propriedade como false
. A KeepAliveEnabled
propriedade não é exposta diretamente no BasicHttpBinding
, portanto, devemos criar uma associação personalizada para navegar até o elemento binding e definir essa propriedade.
Para modificar uma associação fornecida pelo sistema
Crie uma instância da BasicHttpBinding classe e defina seu modo de segurança para o nível da 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
Crie uma associação personalizada a partir da associação e crie uma BindingElementCollection classe a partir 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
Faça um loop pela BindingElementCollection classe e, quando encontrar a HttpTransportBindingElement classe, defina sua KeepAliveEnabled propriedade 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 = {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