2011-09-29 14 views
10

¿Existe alguna manera de crear una instancia de un cliente de servicio WCF en C# con una dirección de punto final especificada sin especificar un nombre de configuración?Crear cliente de servicio WCF con la dirección especificada sin especificar el nombre de configuración

Por defecto, los clientes tienen estos constructores:

public ServiceClient() 
    public ServiceClient(string endpointConfigurationName) 
    public ServiceClient(string endpointConfigurationName, string remoteAddress) 

Obviamente, no es una configuración por defecto, por el primer constructor. Lo que quiero es solo especificar el 2º parámetro del constructor final. En este momento, estoy luchando por leer los elementos de configuración del uso de ConfigurationManager para resolverlo, pero parece terriblemente engorroso. ¿Hay una manera más limpia?

Respuesta

1

Bueno, podría usar el constructor predeterminado, pero luego tendría que programar manualmente en todos los parámetros de configuración. Al especificar el nombre de la configuración, el cliente de servicio cargará automáticamente la configuración desde el archivo .config; todo lo que necesita saber es qué configuración usar (puede tener varias, por ejemplo, una para HTTP y otra para Net.Tcp). RemoteAddress, por supuesto, solo le dice a WCF dónde hacer la conexión.

Si tiene problemas para configurar los ajustes del cliente, asegúrese de estar utilizando la herramienta de configuración de servicio WCF. Funciona tanto para la configuración del servicio como para la configuración del cliente.

6

Su cliente generado también debe tener un constructor que tiene este aspecto:

public ServiceClient(
    System.ServiceModel.Channels.Binding binding, 
    System.ServiceModel.EndpointAddress remoteAddress) 
     : base(binding, remoteAddress) { 
    } 

Usted puede llamar a éste sin una configuración de punto final.

8

Prefiero no utilizar la configuración de punto final en el archivo .config. Que normalmente hago algo como esto:

 BasicHttpBinding basicbinding = new BasicHttpBinding(); 
     basicbinding.SendTimeout = TIMEOUT; 
     basicbinding.OpenTimeout = TIMEOUT; 
     ServiceClient client = new ServiceClient(basicbinding, new EndpointAddress(new Uri("http://xxxxx"))); 
+2

La clase EndpointAddress tiene un constructor que toma inmediatamente una cadena uri. No es necesario agregar "nuevo Uri" allí. – Nyerguds

3

Si desea en realidad sólo quiere llamar a un servicio sin tener que saber todo lo que hay que saber acerca de los servicios de WCF y el manejo de configuración, en C# sólo se puede hacer .. .

 String url = "http:\\somehost:someport\\pathToSomeService"; 

     EndpointAddress address = new EndpointAddress(url); 
     Binding binding = new BasicHttpBinding(); 

     YourClient client = new YourClient(binding, address); 

     // Call your client methods 
     client.SomeMethod(parm1, parm2); 

lo anterior presupone que haya generado una referencia de servicio y no requiere la información de configuración de existir en cualquier lugar, no en la referencia de servicio generada, no en el archivo DLL y no en el ejecutable. Sin configuración Ninguna.

Utilizo lo anterior en una verdadera dll de proxy de servicio independiente. Es independiente en el verdadero sentido de la palabra, ya que es completamente configurable sin depender del ejecutable de la llamada para proporcionar nada.

+0

Esto supone un enlace HTTP básico, que no podría asumir. Terminé leyendo la sección del cliente de servicio desde el archivo de configuración de forma manual y generando el enlace de forma programática. – recursive

Cuestiones relacionadas