16 de diciembre de 2015

Multiples bindings WCF

Para empezar quiero mostrar la información del sitio de Microsoft sobre múltiples bindings(click sobre la imagen para leer mejor)


A continuación presento una combinación de endpoints validos en un servicio WCF

Binding(B1) + Address(A1) + Contract(C1)  —>  EndPoint valido
Binding(B1) + Address(A2) + Contract(C1)  —>  EndPoint valido
Binding(B1) + Address(A1) + Contract(C2)  —>  EndPoint valido
Binding(B1) + Address(A1) + Contract(C3)  —>  EndPoint valido

Binding(B2) + Address(A2) + Contract(C1)  —>  EndPoint valido
Binding(B3) + Address(A3) + Contract(C1)  —>  EndPoint valido

Con el ejemplo anterior dejamos claro dos cosas:

1) Múltiples Endpoints:
 Address compartida - Bindings iguales - Contracts diferentes

Es permitido que múltiples EndPoints utilicen el mismo tipo de binding e incluso tener la misma dirección pero pueden diferir en el contrato, esto es un beneficio ya que logra definir para diferentes clientes uno y solamente un binding, definir una única dirección para diferentes endpoints  y entregar a diferentes clientes la misma dirección de referencia al servicio WCF pero cada cliente tendrá diferentes operaciones disponibles esto se logra definiendo distintas operaciones en diferentes interfaces.

Como ejemplo para este caso se creara un proyecto WCF Service el cual tendrá tres interfaces y una clase que las implementa, el solution explorer del proyecto queda de esta manera


en la siguientes imágenes expongo el código de las interfaces, solamente definen un método string que devuelve un saludo al usuario indicando que interface se implementa, la interface IGeneral hereda de la interface IBinding01 y de la interface IBinding02 tal como se muestra en el código

interface IBinding01.cs

interface IBinding02.cs
interface IGeneral.cs

y el código de Binding.cs que es la clase que implementa la interface IGeneral es 


como ven en el código anterior, en la clase Binding solamente implemento la interface IGeneral pues esta contiene los métodos definidos en IBinding01, y IBinding02, pero si ustedes quieren especificar las interfaces por separado e implementar explícitamente los métodos de cada interface también es valido el procedimiento que se utiliza en esta entrada, de hecho el cambio solamente sería en la clase Binding al momento de especificar las interfaces después todo lo que se aplica a continuación es exactamente lo mismo asi que tu decides como codificas tu clase Binding, aquí muestro el ligero cambio en la clase Binding cuando se quiera especificar explícitamente cada interface a implementar


este es la configuración del Web.config para múltiples endpoints con el mismo tipo de binding, mismo servicio pero diferente contrato

  
    
      
        
          
        
      
    
    
      
        
        
        
        
        
          
            
          
        
      
    
    
  
  
    
  
    
        
    

El proyecto se aloja en IIS, ahora procedere a crear un proyecto de tipo Windows Forms que actuara como cliente del servicio WCF, muestro la imagen para agregar la referencia de servidor


el intellisense de Visual Studio ahora reconoce las tres interfaces definidas en el servico WCF


este es el formulario a utilizar


por ultimo el codigo del formulario que actúa como cliente y también la imagen del formulario con los mensajes provenientes desde cada contrato
private void button1_Click(object sender, EventArgs e)
 {
  cliente.GeneralClient cliente = new ClienteWCF.cliente.GeneralClient();
  label1.Text = cliente.saludo01(textBox1.Text.ToString());
  label2.Text = cliente.saludo02(textBox1.Text.ToString());
  label3.Text = cliente.saludoGeneral(textBox1.Text.ToString());
 }


2) Múltiples Endpoints:
 Address diferentes - Bindings diferentes - Contract igual

Si por el contrario cada endpoint utiliza un binding diferente entonces se hace necesario crear diferentes direcciones de acceso al servicio WCF, en este caso es valido utilizar el mismo contrato para todos los endpoints, no es necesario crear uno nuevo por cada binding.
El beneficio aquí es que el servicio WCF y las mismas operaciones definidas en este estarán disponibles para diferentes protocolos de acceso.

Como ejemplo se crearan tres endpoints con tres diferentes bindings, como se puede ver en el código cada endpoint especifica una dirección única que será el distintivo del binding utilizado

  
 
  

  
  
  
  
  
  
  





También se pueden especificar todas las direcciones a utilizar en el nodo