2009-06-17 8 views
11

Sie möchten einen Client erstellen, der serialisierte Nachrichtenobjekte über WCF an einen Server sendet.WCF-Client-Konfiguration: Wie kann ich prüfen, ob der Endpunkt in der Konfigurationsdatei ist, und Fallback auf den Code, wenn nicht?

Um den Endentwicklern (verschiedenen Abteilungen) die Arbeit zu erleichtern, wäre es am besten, wenn sie nicht wissen müssten, wie sie ihre Konfigurationsdatei bearbeiten müssen, um die Client-Endpunktdaten einzurichten.

Das gesagt, wäre auch genial, dass der Endpunkt auch nicht in den Client eingebettet/fest codiert war.

Ein Mix Szenario erscheint mir würde die einfachste Lösung zu sein Roll-out: Endpunkt

IF (beschrieben in config) USE Konfigurationsdatei ELSE Rückfall auf hartcodiert.

Was herausgefunden, ich habe, ist:

  1. new Client(); schlägt fehl, wenn keine Konfigurationsdatei Definition gefunden.
  2. new Client(binding,endpoint); arbeitet

daher:

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

Aber gibt es eine Möglichkeit, um Check (außer try/catch) zu sehen, ob Konfigurationsdatei ein Endpunkt erklärt hat?

Würde das obige auch nicht fehlschlagen, wenn in der Konfigurationsdatei definiert, aber nicht richtig konfiguriert? Wäre es gut, zwischen den beiden Bedingungen zu unterscheiden?

Antwort

7

hier ist die Möglichkeit, die Konfigurationsdatei und laden Sie die Daten in ein leicht zu lesen Objekt zu verwalten:

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

Die „cs“ Objekt wird eine Sammlung belichten dem Namen „Endpunkte“, die Sie erlaubt es, alle für den Zugriff auf die Eigenschaften, die Sie in der Konfigurationsdatei finden.

Stellen Sie sicher, dass Sie auch die "else" -Abzweige der "if" s behandeln und behandeln sie als Fehlerfälle (Konfiguration ist ungültig).

+0

Danke Alex für die Suche nach einer Lösung. (Wish MS würde diese Arten von Methoden zum Framework selbst hinzufügen.) –

+0

Das Problem (für mich) mit Alex Ansatz ist, dass Silverlight scheint nicht die System.Configuration DLL ... :(So können Sie ' t lesen Sie die ClientConfig auf einfache Weise wer eine Idee hat, wie dies in Silverlight zu tun,/ohne/stuff in den Code Hardwiring Vielen Dank im Voraus –

10

Ich möchte eine verbesserte Version der AlexDrenea Lösung vorschlagen, die nur spezielle Typen für Konfigurationsabschnitte verwendet.

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 (). Beliebig (e => e.Contract == "Services.IContract")) Verwendung (var contract = new ContractClient()) { } sonst normal verwenden –