代码之家  ›  专栏  ›  技术社区  ›  Omar Kooheji

WCF NET TCP绑定服务器拒绝超过5个连接

wcf
  •  0
  • Omar Kooheji  · 技术社区  · 15 年前

    我已经为一个客户编写并推出了一个使用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 回复  |  直到 15 年前
        1
  •  4
  •   marc_s Hady Salah    15 年前

    前面的几个问题:

    • 在服务器端,配置是什么样子的?
    • 服务器运行在什么操作系统下?(某些操作系统版本/版本有限制)
    • 您如何在该服务器上托管WCF服务?(IIS与自托管)

    您基本上可以使用 ServiceThrottling 行为,你可以定义

    • 最大并发调用数
    • 最大并发会话数(包括TCP/IP传输会话)
    • 服务类实例的最大数目

    要进行配置,请尝试以下操作:

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

    当然,您的服务配置随后必须引用该行为配置。

    不过,没有一个默认值是5:—(但在您的情况下,我会尝试将所有设置都调到25或其他值,看看这是否有任何区别,然后根据您的需要进行调整(并监视服务器的CPU和内存负载!).

    马克

    更新:
    您当然也可以在代码中这样做-类似于这样(在服务器端,在服务器端,您可以实例化 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();
    
        ...
    }