2009-06-17 3 views
11

Buscando hacer un Cliente que envíe objetos de Mensaje serializados a un servidor a través de WCF.Configuración de cliente de WCF: ¿cómo puedo verificar si el punto final está en el archivo de configuración, y si no lo hago?

Para facilitar las cosas al desarrollador final (diferentes departamentos) sería mejor que no necesiten saber cómo editar su archivo de configuración para configurar los datos del punto final del cliente.

Dicho esto, también sería brillante que el punto final no estuviera incrustado/codificado en el Cliente tampoco.

Un escenario mezcla parece a mí ser la solución más fácil de desplegar:

SI (descrito en config) utiliza el archivo de configuración de respaldo ELSE a punto final no modificable.

Lo que he descubierto es:

  1. new Client(); falla si hay una definición fichero de configuración encontrado.
  2. new Client(binding,endpoint); obras

, por lo tanto:

Client client; 
try { 
    client = new Client(); 
}catch { 
    //Guess not defined in config file... 
    //fall back to hard coded solution: 
    client(binding, endpoint) 
} 

pero ¿hay alguna manera de cheque (que no sea try/catch) para ver si el archivo de configuración ha declarado un punto final?

¿Lo anterior tampoco fallará si se define en el archivo de configuración, pero no se configura correctamente? Sería bueno distinguir entre las dos condiciones?

Respuesta

7

aquí es la manera de leer el archivo de configuración y cargar los datos en un formato fácil de manejar objeto:

Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ConfigurationSectionGroup csg = c.GetSectionGroup("system.serviceModel"); 
if (csg != null) 
{ 
    ConfigurationSection css = csg.Sections["client"]; 
    if (css != null && css is ClientSection) 
    { 
     ClientSection cs = (ClientSection)csg.Sections["client"]; 
     //make all your tests about the correcteness of the endpoints here 
    } 
} 

El objeto "CS" expondrá una colección denominada "puntos finales" que le permite acceder a todas las propiedades que encuentras en el archivo de configuración

Asegúrese de que también trata las ramas "else" de los "si" y las trata como casos fallidos (la configuración no es válida).

+0

Gracias Alex por encontrar una solución. (Wish MS agregaría estos tipos de métodos al Framework en sí.) –

+0

El problema (para mí) con el enfoque de Alex es que Silverlight no parece tener el DLL de Configuración del Sistema ... :(Así que puedes ' T leer el ClientConfig de una manera fácil cualquier persona que tenga alguna idea sobre cómo hacer esto en Silverlight,/sin/hardwiring cosas en el código Gracias de antemano –

10

Me gustaría proponer una versión mejorada de la solución AlexDrenea, que utiliza solo tipos especiales para las secciones de configuración.

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     ServiceModelSectionGroup serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup(configuration); 
     if (serviceModelGroup != null) 
     { 
      ClientSection clientSection = serviceModelGroup.Client; 
      //make all your tests about the correcteness of the endpoints here 

     } 
+1

1 Niza LINQified:.?!. if (serviceModelGroup! = null && serviceModelGroup .Client.Endpoints.Cast (). Cualquiera (e => e.Contract == "Services.IContract")) usando (var contract = new ContractClient()) { } else use normal –

Cuestiones relacionadas