2009-06-17 13 views
11

Cercare di creare un client che invii gli oggetti messaggio serializzati su un server tramite WCF.Configurazione client WCF: come posso verificare se l'endpoint si trova nel file di configurazione e fallback nel codice se non lo è?

Per semplificare le cose allo sviluppatore finale (diversi reparti) sarebbe meglio che non avessero bisogno di sapere come modificare il proprio file di configurazione per impostare i dati del punto finale del client.

Detto questo, sarebbe anche geniale che l'endpoint non fosse incorporato/codificato nel client.

Uno scenario mix sarebbe mi sembra essere la soluzione più semplice per stendere:

IF (descritto in config) Utilizzare file di configurazione di ripiego altro endpoint hard-coded.

Quello che ho scoperto è:

  1. new Client(); fallisce se nessuna definizione file di configurazione trovato.
  2. new Client(binding,endpoint); funziona

quindi:

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

Ma esiste un modo per controllo (diversi try/catch) per vedere se il file di configurazione ha dichiarato un endpoint?

Quanto sopra non avrà esito negativo anche se definito nel file di configurazione, ma non configurato correttamente? Sarebbe bene distinguere tra le due condizioni?

risposta

7

qui è il modo per leggere il file di configurazione e caricare i dati in un facile da gestire oggetto:

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 
    } 
} 

L'oggetto "cs" esporrà una collezione denominata "endpoint" che permette di accedere a tutte le proprietà che trovi nel file di configurazione.

Assicurarsi di considerare anche i rami "else" dei "se" e trattarli come casi di errore (la configurazione non è valida).

+0

Grazie Alex per aver trovato una soluzione. (Wish MS aggiungerebbe questo tipo di metodi allo stesso Framework). –

+0

Il problema (per me) con l'approccio di Alex è che Silverlight non sembra avere la DLL System.Configuration ... :(Quindi puoi ' t leggere il ClientConfig in modo semplice Chiunque ha tutte le idee su come fare questo in Silverlight,/senza/hardwiring roba nel codice Grazie in anticipo –

10

Vorrei proporre una versione migliorata della soluzione AlexDrenea, che utilizza solo tipi speciali per le sezioni di configurazione.

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 Nizza LINQified:.?!. if (serviceModelGroup! = null && serviceModelGroup .Client.Endpoints.Cast (). Any (e => e.Contract == "Services.IContract")) utilizzando (var contract = new ContractClient()) { } altro uso normale –