Связывающий сервер WCF Net Tcp, отказывающий более 5 соединений - PullRequest
0 голосов
/ 05 октября 2009

Я написал и развернул для клиента приложение, которое использует NetTcpBinding для связи.

У меня есть серверное приложение, которое принимает запросы на подписку от клиентов, а затем передает данные клиентам.

Клиент видит проблему на сайте, когда сервер, к которому подключено 5 клиентов, отказывается больше.

Кто-нибудь видел такое поведение раньше? Кто-нибудь знает, что может быть причиной этого? Он отлично работает для меньшего количества пользователей.

Я сейчас пытаюсь диагностировать это сам, но я новичок в WCF, поэтому мне было интересно, было ли какое-то общее решение для такого рода проблем?

Я получаю следующую трассировку стека (Sanitzes для удаления имени клиента и имени продукта):

2009-09-30 13:03:16,308 [1] ERROR [(null)] - Failed to subscribe to the VDN server, there was no server listening for connections at the configured URI
System.ServiceModel.EndpointNotFoundException: Could not connect to net.tcp://server:4000/VDNService. The connection attempt lasted for a time span of 00:00:01.0312236. TCP error code 10061: No connection could be made because the target machine actively refused it 10.65.1.42:4000.  ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 10.65.1.42:4000
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
   at System.ServiceModel.Channels.SocketConnectionInitiator.Connect(Uri uri, TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace: 
   at System.ServiceModel.Channels.SocketConnectionInitiator.Connect(Uri uri, TimeSpan timeout)
   at System.ServiceModel.Channels.BufferedConnectionInitiator.Connect(Uri uri, TimeSpan timeout)
   at System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout)
   at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
   at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at ClientLib.IServer.Subscribe(List`1 groups)
   at ClientLib.Client.Subscribe(List`1 groupNames)

1 Ответ

4 голосов
/ 05 октября 2009

Несколько вопросов заранее:

  • На вашей стороне сервера, как вы выглядите?
  • В какой ОС работает сервер? (некоторые версии / выпуски ОС имеют ограничения)
  • Как вы размещаете свою службу WCF на этом сервере? (IIS против хостинга)

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

  • максимальное количество одновременных звонков
  • максимальное количество одновременных сеансов (включая транспортные сеансы TCP / IP)
  • максимальное количество экземпляров класса обслуживания

Для настройки попробуйте это:

<serviceBehaviors>
    <behavior name="throttledService">
      <serviceThrottling 
          maxConcurrentCalls="10"
          maxConcurrentInstances="10"
          maxConcurrentSessions="10"/>
    </behavior>

и, конечно, ваша сервисная конфигурация должна будет ссылаться на эту конфигурацию поведения.

Однако ни одно из этих значений по умолчанию не равно 5 :-( Но в вашем случае я бы попытался проверить все настройки до 25 или около того и просто посмотреть, будет ли это иметь значение, а затем настроить ваши потребности (и контролировать загрузку процессора и памяти сервера!).

Марк

UPDATE:
Вы также можете определенно сделать это в коде - что-то вроде этого (на стороне сервера, где вы создаете экземпляр своего класса ServiceHost, если вы размещаетесь самостоятельно):

using (ServiceHost host = new ServiceHost(typeof(MyWCFService)))
{
    ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior();
    stb.MaxConcurrentCalls = 25;
    stb.MaxConcurrentInstances = 25;
    stb.MaxConcurrentSessions = 25;

    host.Description.Behaviors.Add(stb);

    host.Open();

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...