WCF Manejando Generics en el Cliente

Una de las cosas que mas me molestaban, era definir mis operaciones en el servicio utilizando Generics y ver que en el cliente la generación de la clase me transformaba esos Generics en arrays asi que empece a curiosear a ver si podia utilizar Generics en el cliente. 

Una de las cosas nuevas de WCF es la posibilidad de no tener que definir un proxy a partir de un wsdl, de manera que si estoy haciendo una aplicación distribuida mia y solo mia, en la cual yo defino la  interfaz del servicio y nadie mas tiene que conocerla porque solo voy a acceder yo,  puedo llegar a compartir esta interfaz en ambos lados (servicio y cliente) haciendo que los proyectos, y las comunicaciones, queden más limpios y no haya que refrescar los proxys. Al ser la misma Interfaz la que manejo en el cliente vere Generics en vez de arrays en aquellas OperationContract que los utilizen.

Para ello voy a utilizar la clase ChannelFactory, esta clase me permite generar proxys en el cliente a partir de la interfaz.

 

using (ChannelFactory<IEchoServiceChannel> factory = 
new ChannelFactory<IEchoServiceChannel>(new NetTcpBinding()))
 {
  using (IEchoServiceChannel proxy = 
           factory.CreateChannel(new EndpointAddress(@"net.tcp://localhost:8080/Echo")))
    {
            proxy.Echo("Hola!");
    }                    
 }

En este caso no nos hace falta el fichero de configuración ya que estamos creando el proxy manualmente.

Pero esta solución no me gusta porque se pierde toda la facilidad que teniamos en los servicios de WCF de cambiar sus caracterisicas sin tener que recompilar nada de codigo ya que no tenemos fichero de configuración.

Para solucionar esto tenemos que tirar de la herramienta svcutil con estos parametros:

svcutil /o:holaproxy.cs /ct:System.Collections.Generic.List`1 http://localhost:8000/Hola/

Y nos creara la clase cliente con los tipos genericos al igual que habiamos definido en el contrato del servicio.

2 comentarios sobre “WCF Manejando Generics en el Cliente”

  1. Pero esta solución no me gusta porque se pierde toda la facilidad que teniamos en los servicios de WCF de cambiar sus caracterisicas sin tener que recompilar nada de codigo ya que no tenemos fichero de configuración. ????

    Para eso tu puede utiizar wsdl para buscar y encontrar los “endpoints” servidores en el cliente y pôder utilizar ChannelFactory sin tenir los endPoints lado cliente.

    Se puede utilizar un algorithme para eligir el mejor endPoints disposegun la nible (http, tcp, netpipe) segun la topologia cliente/servidor. (En la misma red intranet (tcp), en la misma maquina (net-tpc) en internet (http).

    Federico POGGIO

  2. Para descoubrir los endpoints el codigo es aqui

    MetadataExchangeClient __metaDataExchangeClient = new MetadataExchangeClient(__basicHttpBinding);

    __metaDataExchangeClient.MaximumResolvedReferences = 64;

    WsdlImporter __wsdlImporter = new WsdlImporter(__metaDataExchangeClient.GetMetadata(wsdlLocation, MetadataExchangeClientMode.HttpGet));

    ServiceEndpointCollection __svcEndPointCollection = __wsdlImporter.ImportAllEndpoints();

    Federico POGGIO

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *