Переопределяющий файл конфигурации Базовые адреса WCF в коде

У меня есть служба 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 затем, это хорошо работает - т.е. Я могу указать новые основания. Однако я хочу использовать файл конфигурации для определения значения по умолчанию (вместо трудного кодирования).

7
задан abatishchev 30 May 2012 в 19:25
поделиться

1 ответ

Взгляните на этот пример, который я опубликовал. В нем есть полный рабочий пример службы WCF, полностью настроенной с помощью кода. Затем вы сможете просто получить номер порта с помощью Environment.GetEnvironmentVariable и передать его в конструктор ServiceHost:

Можно ли иметь такой же контракт, такую ​​же привязку, тот же адрес, но разные порты?

5
ответ дан 7 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: