WCF - Enlace de servicio

El enlace de servicio WCF es un conjunto de varios elementos en los que cada elemento define la forma en que el servicio se comunica con el cliente. Un elemento de transporte y un elemento de codificación de mensajes son los dos componentes más importantes de cada enlace. En este capítulo, analizaremos varios enlaces de servicio WCF que se usan comúnmente.

Encuadernación básica

La clase BasicHttpBinding ofrece el enlace básico. Utiliza el protocolo HTTP para transportar y representar un servicio WCF como un servicio web ASP.NET (servicio web ASMX), de modo que los clientes antiguos que utilizan los servicios web ASMX puedan consumir los nuevos servicios cómodamente.

El enlace básico se establece como enlace predeterminado en un servicio web WCF habilitado por Silverlight y es un enlace estándar para las comunicaciones en el estilo del servicio web. No admite mensajería confiable.

A continuación se muestra un fragmento de código que describe la configuración predeterminada para el enlace básico.

<basicHttpBinding>
   <binding name = "basicHttpBindingDefaults" allowCookies = "false" 
      bypassProxyOnLocal = "false" hostNameComparisonMode = "StrongWildcard" 
      maxBufferPoolSize = "524288" maxBufferSize = "65536" 
      maxReceivedMessageSize = "65536" messageEncoding = "Text" proxyAddress = "" 
      textEncoding = "utf-8" transferMode = "Buffer" useDefaultWebProxy = "true" 
      closeTimeout = "00:01:00" openTimeout = "00:01:00" receiveTimeout = "00:10:00" 
      sendTimeout = "00:01:00">
   
      <readerQuotas maxArrayLength = "16384" maxBytesPerRead = "4096" 
         maxDepth = "32"
         maxNameTableCharCount = "16384" maxStringContentLength = "8192"/>

      <security mode = "None">
         <transport clientCredentialType = "None" proxyCredentialType = "None" realm = ""/>
         <message algorithmSuite = "Basic256" clientCredentialType = "UserName" />
      </security>       
   </binding>

</basicHttpBinding>

La configuración predeterminada anterior tiene sus limitaciones obvias, ya que el tamaño del mensaje es limitado y no hay modo de seguridad. Sin embargo, la personalización del enlace básico resuelve este problema como el siguiente.

<basicHttpBinding>
   <binding name = "basicHttpSecure" maxBufferSize = "100000" maxReceivedMessageSize = "100000">
   
      <readerQuotas maxArrayLength = "100000" maxStringContentLength = "100000"/>
      <security mode = "TransportWithMessageCredential" />
     
   </binding>
</basicHttpBinding>

Enlace de servicios web

El enlace de servicio web (WS) lo proporciona la clase WSHttpBinding. Es bastante similar al enlace básico y utiliza los mismos protocolos para el transporte, pero ofrece varias especificaciones WS– * como WS – Reliable Messaging, WS – Transactions, WS – Security y muchas más. En pocas palabras, WSHttpBinding es igual a la suma de las especificaciones basicHttpBinding y WS– *. A continuación se muestra un fragmento de código que describe la configuración predeterminada para WS Binding:

<wsHttpBinding>
   <binding name = "wsHttpBindingDefaults" allowCookies = "false" 
      bypassProxyOnLocal = "false" closeTimeout = "00:01:00" 
      hostNameComparisonMode = "StrongWildcard" 
      maxBufferPoolSize = "524288" maxReceivedMessageSize = "65536" 
      messageEncoding = "Text" openTimeout = "00:01:00" 
      receiveTimeout = "00:10:00" proxyAddress = "" sendTimeout = "00:01:00" 
      textEncoding = "utf-8" transactionFlow = "false" 
      useDefaultWebProxy = "true" > 
   
      <readerQuotas maxArrayLength = "16384" maxBytesPerRead = ."4096" 
         maxDepth = "32" maxNameTableCharCount = "16384" 
         maxStringContentLength = "8192"/>

      <reliableSession enabled = "false" ordered = "true" 
         inactivityTimeout = "oo:10:00" /> 

      <security mode = "Message">
         <message algorithmSuite = "Basic256" clientCredentialType = "Windows" 
            esatalishSecurityContext = "true" 
            negotiateServiceCredential = "true" />

         <transport clientCredentialType = "Windows"
            proxyCredentialType = "None" realm = ""/>        	
      </security>
      
   </binding>
</wsHttpBinding>

Encuadernación IPC

El enlace de IPC utiliza una tubería con nombre y lo ofrece la clase netNamedPipeBinding. Esta es la encuadernación más rápida y segura entre todas las encuadernaciones disponibles. Aunque aquí no se admite la seguridad a nivel de mensaje, los mensajes son seguros de forma predeterminada debido a una sólida seguridad de transporte. A continuación se muestra el fragmento de código que muestra la configuración predeterminada para el enlace de IPC:

<netNamedPipeBinding>
   
   <binding name = "netPipeDefaults" closeTimeout = "00:01:00" 
      hostNameComparisonMode = "StrongWildcard" maxBufferPoolSize = "524288" 
      maxBufferSize = "65536" maxConnections = "10" 
      maxReceivedMessageSize = "65536" openTimeout = "00:01:00" 
      receiveTimeout = "00:10:00" sendTimeout = "00:01:00" transactionFlow = "false" 
      transactionProtocol = "OleTransactions" transferMode = "Buffered">  

      <readerQuotas maxArrayLength = "16384" maxBytesPerRead = "4096" 
         maxDepth = "32" maxNameTableCharCount = "16384" 
         maxStringContentLength = "8192"/>
   
      <security mode = "Transport">        	
      </security>
      
   </binding>
</netNamedPipeBinding>

Otros tipos de enlaces de servicio

  • TCP Binding- Proporcionado por la clase NetTCPBinding, este enlace hace uso del protocolo TCP para la comunicación dentro de la misma red y codifica el mensaje en formato binario. Esta encuadernación se considera la más confiable a diferencia de otras.

  • WS Dual Binding- Este tipo de enlace se parece más a WSHttpBinding con la única excepción de que facilita la comunicación bidireccional, es decir, los mensajes pueden ser enviados y recibidos tanto por clientes como por servicios. Lo ofrece la clase WSDualHttpBinding.

  • Web binding - El enlace web está diseñado para representar servicios WCF en forma de solicitudes HTTP mediante el uso de HTTP-GET, HTTP-POST, etc. Es ofrecido por la clase WebHttpBinding y se usa comúnmente con redes sociales.

  • MSMQ Binding- Es ofrecida por la clase NetMsmqBinding y se utiliza para brindar soluciones en caso de que el servicio procese un mensaje en un momento distinto al enviado por el cliente. El enlace de MSMQ hace uso de MSMQ para el transporte y proporciona soporte para mensajes separados en cola. MSMQ es una implementación para la cola de mensajes que ofrece Microsoft.

  • Federated WS Binding- Es una forma específica de enlace WS y ofrece soporte para seguridad federada. Lo ofrece la clase WSFederationHttpBinding.

  • Peer Network Binding- Ofrecido por la clase NetPeerTCPBinding, se utiliza principalmente en sistemas de intercambio de archivos. Utiliza el protocolo TCP pero hace uso de redes de pares como transporte. En esta red, cada máquina (nodo) actúa como cliente y servidor para los demás nodos. El enlace de red de pares se utiliza en sistemas de intercambio de archivos como torrent.

  • MSMQ Integration Binding - Ofrecido por la clase MsmqIntegrationBinding, ayuda a comunicarse con los sistemas existentes que se comunican a través de MSMQ (Microsoft Message Queue Server).

Aparte de estos, también es posible crear enlaces personalizados. Sin embargo, dado que es posible modificar las propiedades de configuración de cada enlace WCF, rara vez surge la necesidad de crear enlaces personalizados.