Когда несколько экземпляров ServiceHost могут использовать один и тот же порт?

Наш сервер приложений предоставляет 5 служб WCF через транспорт net.tcp, все на одном порте. Мы размещали их во время разработки с использованием WcfSvcHost, и мне никогда не приходилось думать о том, как им удается использовать один и тот же порт.

Сейчас мы перемещаем их в службу Windows, и теперь я сам создаю экземпляры ServiceHost. Одна из служб использует потоковый режим передачи по протоколу Tcp.

При запуске этих служб с использованием файла конфигурации с WcfSvcHost они работают нормально. Но в нашем сервисе жалуются на то, что порт используется.

Может ли потоковая служба использовать один и тот же порт?


person Andre Luus    schedule 30.09.2011    source источник


Ответы (3)


В конце концов, я решил проблему после множества проб и ошибок с программной настройкой привязок.

Кажется, что что-то в стеке привязки, сгенерированном при создании NetTcpBinding, позволяет нескольким NetTcpBinding использовать порт. Проблема заключалась в том, что мне нужно было сделать кастомную привязку.

Решение заключалось в создании пользовательской привязки на основе NetTcpBinding. Например:

        var lBinding = new NetTcpBinding() 
        {
            SendTimeout = TimeSpan.FromMinutes(5),
            ReceiveTimeout = TimeSpan.FromMinutes(5),

            MaxConnections = 100,
            ReliableSession = new OptionalReliableSession 
            { 
                Enabled = true,
                Ordered = true,
                InactivityTimeout = TimeSpan.FromMinutes(30)
            },
            Security = new NetTcpSecurity
            { 
                Mode = SecurityMode.TransportWithMessageCredential,
                Message = new MessageSecurityOverTcp { ClientCredentialType = MessageCredentialType.UserName } 
            },
            MaxReceivedMessageSize = 524288
        };

        var lCustomBinding = new CustomBinding(lBinding);

        // Edit the custom binding elements here

        var lEndpoint = new ServiceEndpoint(lContract, lCustomBinding, new EndpointAddress(pServiceHost.BaseAddresses.First()));
person Andre Luus    schedule 01.03.2012
comment
Андре, что такого особенного в этой настраиваемой привязке, которая позволяет использовать совместное использование портов? - person anton.burger; 07.09.2012
comment
Привет, извините за задержку с ответом. Я сменил работу и не вошел в SO. Дело в следующем: я не мог запустить несколько CustomBinding конечных точек на одном и том же порте, даже если они кажутся содержащими одни и те же элементы. Мне пришлось построить CustomBinding, передав ему NetTcpBinding в конструкторе, а затем изменив его. - person Andre Luus; 14.09.2012

Я нашел другое решение этой проблемы, используя RoutingService класс. Каждый контракт должен по-прежнему размещаться в собственном ServiceHost, но может быть RoutingService, сидящий поверх всех контрактов - и представляющий их через единую «конечную точку». Я также написал об этом статью о codeproject. Пример кода также доступен на Bitbucket.

person m0sa♦    schedule 29.02.2012
comment
Звучит интересно! Мне придется взглянуть на это в какой-то момент. К счастью, мне удалось решить возникшую у меня проблему. Я отправлю ответ по этому поводу. - person Andre Luus; 01.03.2012

См. здесь о совместном использовании портов Net.TCP, о котором вы находясь в поиске.

Для этого вам также необходимо включить службу.

person CodeCaster    schedule 30.09.2011
comment
Фактически, другие службы Tcp использовали порт без этой службы. Кроме того, как это работает при размещении в WcfSvcHost? - person Andre Luus; 30.09.2011