У меня есть служба Windows WCF с конечной точкой, указанной в файле конфигурации для сервиса.
<baseAddresses>
<add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>
Все работы хорошо. Однако в некоторых случаях порт 9000 мог бы уже использоваться который причины ServiceHost для падения на Открытом (). Я должен смочь ПЕРЕОПРЕДЕЛИТЬ базовый адрес по умолчанию, указанный в файле конфигурации в коде. например, предположите, что переменная среды содержит номер порта, который будет использоваться.
Там какой-либо путь состоит в том, чтобы сделать это программно?
После того, как ServiceHost создается, я вижу свойство BaseAddresses, которое возвращает список Uri, взятый из файла конфигурации. Однако это - набор только для чтения, так не может использоваться для изменения значений по умолчанию.
Если я указываю заменяющий Uri в конструкторе ServiceHost, я добираюсь
Этот набор уже содержит адрес со схемой net.tcp. Может быть самое большее один адрес на схему в этом наборе. Если Ваш сервис размещается в IIS, можно решить проблему путем установки 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' к истинному или определения 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters''.
Если я создаю CustomServiceHost и пытаюсь установить заменяющий базовый адрес, я получаю ту же ошибку.
class CustomHost : ServiceHost
{
public CustomHost(Type serviceType) : base (serviceType)
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
this.AddBaseAddress(new Uri("net.tcp://localhost:9010/MyEndpoint"));
}
}
Я знаю, что, если я оставляю пробел базовых адресов файла конфигурации и передаю базовый адрес в конструктора ServiceHost затем, это хорошо работает - т.е. Я могу указать новые основания. Однако я хочу использовать файл конфигурации для определения значения по умолчанию (вместо трудного кодирования).
Взгляните на этот пример, который я опубликовал. В нем есть полный рабочий пример службы WCF, полностью настроенной с помощью кода. Затем вы сможете просто получить номер порта с помощью Environment.GetEnvironmentVariable и передать его в конструктор ServiceHost:
Можно ли иметь такой же контракт, такую же привязку, тот же адрес, но разные порты?