Я пытаюсь настроить базовый адрес узла до запуска узла службы 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, в зависимости от запущенного экземпляра?Если я заблудился в лабиринте хаков - покажи дорогу обратно к главной дороге.