Проблемы с написанием программных изменений конфигурации для WCF - PullRequest
3 голосов
/ 04 марта 2010

Мне нужно иметь возможность обновлять мой конфигурационный файл программно и изменять настройки WCF. Я пытался сделать это внутри некоторого тестового кода, используя некоторые примеры, которые я нашел в Интернете, но так и не смог получить файл конфигурации для отражения изменения адреса конечной точки.

Конфиг (фрагмент):

  <!-- Sync Support -->
  <service   name="Server.ServerImpl"
             behaviorConfiguration="syncServiceBehavior">

    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8000/SyncServerHarness"/>
      </baseAddresses>
    </host>

    <endpoint name="syncEndPoint" 
              address="http://localhost:8000/SyncServerHarness/Sync"
              binding="basicHttpBinding"
              contract="Server.IServer" />

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

  </service>

Код:

Configuration config = ConfigurationManager.OpenExeConfiguration
                       (ConfigurationUserLevel.None);

ServiceModelSectionGroup section = (ServiceModelSectionGroup)
                                   config.SectionGroups["system.serviceModel"];

foreach (ServiceElement svc in section.Services.Services)
{
   foreach (ServiceEndpointElement ep in svc.Endpoints)
   {
       if (ep.Name == "syncEndPoint")
       {
          ep.Address = new Uri("http://192.168.0.1:8000/whateverService");

       }
   }
}

config.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection("system.serviceModel");

Этот код выполняется без исключений, но без изменений. Также у меня были проблемы с индексацией конечных точек и сервисов. Есть ли простой способ найти его? Использование имени в качестве индексатора не сработало.

Спасибо!

Sieg

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Я изменил две вещи, и у меня это прекрасно работает:

1) Я использую OpenExeConfiguration с путем сборки

2) Я получаю доступ к разделу <services>, а не к группе <system.serviceModel>

С этими двумя изменениями все работает просто отлично:

Configuration config = ConfigurationManager.OpenExeConfiguration
                       (Assembly.GetExecutingAssembly().Location);

ServicesSection section = config.GetSection("system.serviceModel/services") 
                             as ServicesSection;

foreach (ServiceElement svc in section.Services)
{
   foreach (ServiceEndpointElement ep in svc.Endpoints)
   {
       if (ep.Name == "syncEndPoint")
       {
          ep.Address = new Uri("http://192.168.0.1:8000/whateverService");
       }
   }
}

config.Save(ConfigurationSaveMode.Full);
1 голос
/ 10 февраля 2015

На всякий случай ... если у вас есть какая-то странная магия без обновления app.config после вызова метода RefreshSection, убедитесь, что вы не вызываете его как в оригинале почта:

ConfigurationManager.RefreshSection("system.serviceModel");

Таким образом, это никогда не работает. Звонок просто игнорируется и проходит мимо. Вместо этого назовите это так:

ConfigurationManager.RefreshSection("system.serviceModel/client");

Необходимо указать раздел ( клиент , привязки , поведения , ...). Если вам нужно обновить весь конфиг, то итерируйте все разделы в цикле. MSDN хранит молчание об этом факте. Я потратил 3 дня на поиски этого дерьма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...