2010-06-30 16 views
6

Mam plik app.config, który w formie:Jak odczytać wartość atrybutu zdefiniowanego w pliku 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> 

Chcę odczytać wartość w atrybucie „Adres” punktu końcowego węzła, który ma name = „XXX”. Proszę, pokaż mi, jak to zrobić!

(dalej belowing disscussing z marc_s Niestety umieścić tekst tutaj ponieważ komentarz nie pozwalają kodów wielkoformatowych.) @marc_s: Używam z poniższych kodów, aby przeczytać powyższy plik, ale to pokazuje, że clientSection.Endpoints ma 0 członkowie (Count = 0). Proszę pomóż!

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

nie należy używać „plik * vshost.config - to tylko będzie występować, jeśli uruchomić program z w Visual Studio, użyj 'MyApp.exe.config' zamiast !! –

+0

@marc_s: Witam, zaktualizowałem swój kod, chociaż liczba odczytanych punktów końcowych wciąż wynosi zero –

+0

tak, widzę to - z moim kodem działa, spróbuj! Nie używaj swojej 'ServiceModelSectionGroup.GetSectionGroup (config);' i następujących linii, ale użyj mojego kodu zamiast ('ConfigurationManager.GetSection (....)') - działa w moim przypadku! –

Odpowiedz

15

Naprawdę nie trzeba - środowisko wykonawcze WCF zrobi to za Ciebie.

Jeśli naprawdę muszą - niezależnie od przyczyny - można to zrobić:

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

Jak zdefiniować klasę ClientSection do użycia w kodzie? Nie wiem, jak zdefiniować właściwości punktów końcowych. Czy możemy tam użyć ArrayList? –

+0

@Nam Gi VU: ClientSection jest zdefiniowany w System.ServiceModel.Configuration i ma kolekcję punktów końcowych. Nic tutaj nie definiujesz - korzystasz tylko z istniejących klas frameworka. –

+0

Mam edytować moje pytanie. Proszę spojrzeć. –

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

Można użyć ServiceModelSectionGroup (System.ServiceModel.Configuration), aby uzyskać dostęp do konfiguracji:

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

nadzieję, że pomoże.