2010-06-30 4 views
6

Ich habe eine app.config-Datei, die in Form von:Wie lese ich den Wert eines Attributs, das in app.config definiert ist?

<?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
    <system.serviceModel> 
     <client> 
     <endpoint address="http://something.com" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFileTransfer" 
     contract="ABC" name="XXX" /> 
     <endpoint address="http://something2.com" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFileTransfer" 
     contract="ABC2" name="YYY" /> 
     </client> 
    </system.serviceModel> 
    </configuration> 

ich den Wert in Attribut „Adresse“ des Knotens Endpunkt lesen möchten, die den Namen = „XXX“ hat. Bitte zeig mir, wie es geht!

(weiter belowing mit marc_s Disscussing leider den Text hier zu setzen, da Kommentar nicht erlauben, zu Formatcodes.) @marc_s: ich die folgenden Codes verwenden, um die oben angegebenen Datei zu lesen, aber es zeigt, dass die clientSection.Endpoints 0 hat Mitglieder (Anzahl = 0). Bitte helfen Sie!

public MainWindow() 
    { 
     var exeFile = Environment.GetCommandLineArgs()[0]; 
     var configFile = String.Format("{0}.config", exeFile); 
     var config = ConfigurationManager.OpenExeConfiguration(configFile); 
     var wcfSection = ServiceModelSectionGroup.GetSectionGroup(config); 
     var clientSection = wcfSection.Client; 
     foreach (ChannelEndpointElement endpointElement in clientSection.Endpoints) 
     { 
      if (endpointElement.Name == "XXX") 
      { 
       var addr = endpointElement.Address.ToString(); 
      } 
     } 
    } 
+0

sollten Sie eine * vshost.config“Datei nicht verwenden - das wird nur vorhanden sein, wenn Sie von Ihrem Programm ausführen in Visual Studio.Verwenden Sie stattdessen "MyApp.exe.config" !! –

+0

@marc_s: Hallo, ich habe meinen Code aktualisiert. Obwohl die Anzahl der gelesenen Endpunkte immer noch Null ist. –

+0

Ja, ich kann das sehen - mit meinem Code es funktioniert aber, versuche es! Benutze nicht '' ServiceModelSectionGroup.GetSectionGroup (config); 'und die folgenden Zeilen, sondern benutze stattdessen meinen Code (' ConfigurationManager.GetSection (....) ') - funktioniert in meinem Fall! –

Antwort

15

Sie müssen wirklich nicht - die WCF-Laufzeit wird all das für Sie tun.

Wenn Sie wirklich muss - egal aus welchem ​​Grund - Sie können dies tun:

using System.Configuration; 
using System.ServiceModel.Configuration; 

ClientSection clientSettings = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; 

string address = null; 

foreach(ChannelEndpointElement endpoint in clientSettings.Endpoints) 
{ 
    if(endpoint.Name == "XXX") 
    { 
     address = endpoint.Address.ToString(); 
     break; 
    } 
} 
+0

Wie definieren wir die Klasse ClientSection in Ihrem Code? Ich bin mir nicht sicher, wie Endpoints-Eigenschaften definiert werden. Können wir dort ArrayList verwenden? –

+0

@Nam Gi VU: ClientSection ist in System.ServiceModel.Configuration definiert und verfügt über eine Endpoints-Auflistung. Sie definieren hier nichts - Sie verwenden nur vorhandene Framework-Klassen. –

+0

Ich habe meine Frage bearbeiten. Bitte guck dir das an. –

0
var config = ConfigurationManager.OpenExeConfiguration("MyApp.exe.config"); 
var wcfSection = ServiceModelSectionGroup.GetSectionGroup(config); 
var clientSection = wcfSection.Client; 
foreach(ChannelEndpointElement endpointElement in clientSection.Endpoints) { 
    if(endpointElement.Name == "XXX") { 
     return endpointElement.Address; 
    } 
} 
3

Sie die ServiceModelSectionGroup verwenden können (System.ServiceModel.Configuration), um die Konfiguration für den Zugriff auf:

var config = ConfigurationManager.GetSection("system.serviceModel") as ServiceModelSectionGroup; 
    foreach (ChannelEndpointElement endpoint in config.Client.Endpoints) 
    { 
     Uri address = endpoint.Address; 
     // Do something here 
    } 

Hoffnung, das hilft.

Verwandte Themen