Когда несколько экземпляров ServiceHost могут использовать один и тот же порт?
Наш сервер приложений предоставляет 5 служб WCF через транспорт net.tcp, все на одном и том же порту. Мы размещали их во время разработки с использованием WcfSvcHost, и мне никогда не приходилось думать о том, как им удается использовать один и тот же порт.
Сейчас мы перемещаем их в службу Windows, и теперь я сам создаю экземпляры экземпляров ServiceHost. Одна из служб использует Streamed TransferMode через Tcp.
При запуске этих служб с использованием файла конфигурации с WcfSvcHost они работают нормально. Но в нашем сервисе жалуются на использование порта.
Может ли потоковая служба использовать один и тот же порт?
3 ответа
Я решил проблему в конце концов, после многих проб и ошибок с программной настройкой привязок.
Кажется, что-то в связывающем стеке генерируется при создании 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()));
Я нашел другое решение этой проблемы с помощью класса RoutingService. Каждый контракт должен по-прежнему размещаться в своем собственном ServiceHost
, но может быть RoutingService
сидя на вершине всех из них - и представляя их через единую "конечную точку". Я также написал статью об этом проекте. Пример кода также доступен на Bitbucket.