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

У меня есть служба WCF Windows с конечной точкой, указанной в файле конфигурации для службы.

<baseAddresses>
    <add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>

Все работает нормально. Однако в некоторых случаях порт 9000 уже может использоваться, что приводит к падению ServiceHost на Open (). Мне нужно иметь возможность переопределить базовый адрес по умолчанию, указанный в файле конфигурации в коде. например Предположим, переменная среды содержит номер порта, который будет использоваться.

Есть ли способ сделать это программно?

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

1 Ответ

5 голосов
/ 07 июля 2010

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

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

...