Изменение базовых адресов хоста службы без перезаписи файла конфигурации приложения - PullRequest
1 голос
/ 06 декабря 2010

Я пытаюсь настроить базовый адрес узла до запуска узла службы WCF, чтобы добавить instanceName к базовому адресу:

var baseAddresses = Utils<Uri>.EmptyList;

var cfg = ConfigurationManager.OpenExeConfiguration(
    ConfigurationUserLevel.None);
var serviceModelGroup = cfg.GetSectionGroup("system.serviceModel") as 
    ServiceModelSectionGroup;

var wcfPortalServiceElement = serviceModelGroup.Services.
    Services[typeof(WcfPortal).FullName];
if (wcfPortalServiceElement != null && wcfPortalServiceElement.Host != null)
{
  baseAddresses = wcfPortalServiceElement.Host
        .BaseAddresses
        .Cast<BaseAddressElement>()
        .Select(e => new Uri(e.BaseAddress + "/" + instanceName, 
            UriKind.Absolute))
        .ToArray();
}

Файл app.config выглядит следующим образом:

<services>
  <service name="MyCompany.Common.Csla.WcfPortal" 
      behaviorConfiguration="serviceBehavior">
    <endpoint contract="Csla.Server.Hosts.IWcfPortal"
              binding="customBinding"
              bindingConfiguration="compressed_httpConfig"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8001/MyAgent" />
      </baseAddresses>
    </host>
  </service>
</services>

Мотивация: Я хочу иметь возможность запускать один и тот же агентский процесс несколько раз на одной и той же машине.Каждый экземпляр имеет отдельное имя (задается в командной строке), которое должно быть включено в базовый адрес хоста.Теперь это легко сделать, если app.config вообще не включает коллекцию baseAddresses.Однако мне бы хотелось, чтобы это было в случае, если один агентский процесс запущен без указания имени экземпляра.

Проблема заключается в том, что хост службы объединяет базовые адреса, указанные в его конструкторе, с теми, которые появляются в приложении..config.Естественно, происходит сбой с исключением, поскольку он обнаруживает два адреса по схеме http.

Также: следую ли я основной философии WCF, когда пытаюсь изменить адрес WCF, в зависимости от запущенного экземпляра?Если я заблудился в лабиринте хаков - покажи дорогу обратно к главной дороге.

1 Ответ

0 голосов
/ 10 декабря 2010

Просто думаю о самом простом подходе.Если у вас уже есть метод подключения к экземпляру, если базовый адрес отсутствует, я бы удалил базовый адрес.Затем я поместил бы базовый адрес и имя экземпляра по умолчанию в раздел appsetings app.config.Затем в коде объедините базовый адрес и имя экземпляра, заданные в командной строке, или, если имя экземпляра не указано, используйте имя DefaultInstance из appSettings.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="BaseAddress" value="http://localhost:8001/" />
    <add key="DefaultInstance" value="MyAgent" />
  </appSettings>
</configuration>

И просто для полного раскрытия вы можете легко прочитать эти значенияэтот код.

System.Configuration.ConfigurationManager.AppSettings["BaseAddress"]
...