Когда несколько экземпляров ServiceHost могут использовать один и тот же порт? - PullRequest
1 голос
/ 30 сентября 2011

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Я решил проблему в конце концов, после многих проб и ошибок с программной конфигурацией привязок.

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

Решением стало создание пользовательской привязки на основе 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()));
1 голос
/ 01 марта 2012

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

0 голосов
/ 30 сентября 2011

См. здесь о Net.TCP Port Sharing, который вам нужен.

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

...