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

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

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

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

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

3 ответа

Решение

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

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

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

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

Смотрите здесь о Net.TCP Port Sharing, который вы ищете.

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

Другие вопросы по тегам