2010-06-30 2 views
6

У меня есть app.config файл, в виде:Как узнать значение атрибута, определенного в 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> 

Я хочу прочитать значение в атрибуте «адрес» узла конечной точки, который имеет название = «XXX». Пожалуйста, покажите мне, как это сделать!

(Продолжить belowing disscussing с marc_s Извините, поместить текст здесь, так как комментарии не позволяют кодов форматирования.) @marc_s: Я использую следующие коды, чтобы прочитать выше файл, но он показывает, что clientSection.Endpoints имеет 0 членов (граф = 0). Пожалуйста помоги!

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

вы не должны использовать файл * vshost.config»- это только собирается присутствовать, если вы запустите программу из в Visual Studio. Вместо этого используйте 'MyApp.exe.config'! –

+0

@marc_s: Привет, я обновил свой код. Хотя число прочитанных конечных точек все равно равно нулю. –

+0

да, я вижу, что - с моим кодом это Однако не используйте свою 'ServiceModelSectionGroup.GetSectionGroup (config);' и следующие строки, но вместо этого используйте мой код ('ConfigurationManager.GetSection (....)') - работает в моем случае! –

ответ

15

Вам действительно не нужно - среда выполнения WCF сделает все это за вас.

Если вы действительно должны - по любой причине - вы можете сделать это:

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

Как определить класс ClientSection для использования в вашем коде? Я не уверен, как определить свойства Endpoints. Можем ли мы использовать ArrayList? –

+0

@Nam Gi VU: ClientSection определяется в System.ServiceModel.Configuration и имеет коллекцию Endpoints. Здесь вы ничего не определяете - вы просто используете существующие классы инфраструктуры. –

+0

У меня есть свой вопрос. Пожалуйста, смотрите. –

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

Вы можете использовать ServiceModelSectionGroup (System.ServiceModel.Configuration), чтобы получить доступ к конфигурации:

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

Надежда, что помогает.

Смежные вопросы