2010-06-30 25 views
6

Je dispose d'un fichier app.config qui sous la forme de:Comment lire la valeur d'un attribut défini dans app.config?

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

Je veux lire la valeur à l'attribut « adresse » du point de terminaison de noeud qui a le nom = « XXX ». S'il vous plaît montrez-moi comment le faire!

(Continuer belowing disscussing avec marc_s Désolé de mettre le texte ici depuis des commentaires ne permet pas de codes de format.) @marc_s: J'utilise les codes ci-dessous pour lire le fichier ci-dessus, mais il montre que les clientSection.Endpoints a 0 membres (Count = 0). S'il vous plaît aider!

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

vous ne devriez pas utiliser un fichier * vshost.config » - qui va seulement être présent si vous exécutez votre programme de Utilisez plutôt 'MyApp.exe.config' !! –

+0

@marc_s: Bonjour, j'ai mis à jour mon code, mais le nombre de points de terminaison lus est toujours 0. –

+0

oui, je peux le voir - avec mon code Essayez, n'utilisez pas votre 'ServiceModelSectionGroup.GetSectionGroup (config);' et les lignes suivantes, mais utilisez plutôt mon code ('ConfigurationManager.GetSection (....)') - fonctionne dans mon cas! –

Répondre

15

Vous n'en avez pas vraiment besoin - l'environnement d'exécution WCF fera tout cela pour vous.

Si vous devez vraiment - pour une raison quelconque - vous pouvez le faire:

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

Comment définit-on la classe ClientSection à utiliser dans votre code? Je ne suis pas sûr comment définir les propriétés Endpoints. Pouvons-nous utiliser ArrayList là? –

+0

@Nam Gi VU: ClientSection est défini dans System.ServiceModel.Configuration et possède une collection Endpoints. Vous ne définissez rien ici - vous utilisez simplement des classes de structure existantes. –

+0

J'ai éditer ma question. Jetez un coup d'oeil s'il vous plait. –

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

Vous pouvez utiliser le ServiceModelSectionGroup (System.ServiceModel.Configuration) pour accéder à la configuration:

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

espoir qui aide.