none
个别wcf client 无法连接服务器端,错误:InsufficientMemoryException,别的客户端正常访问wcf服务? RRS feed

  • 问题

  • 错误详细信息如下:

    异常类型:InsufficientMemoryException
    异常消息:Insufficient winsock resources available to complete socket connection initiation.
    异常信息:
    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 PCRGreentyreApplication.MesSvr_c.IMesService.GetGroupByShift(String EquipmentID, DateTime CurDate, String CurShift, String PlineName, String SiteName)
       at PCRGreentyreApplication.MesSvr_c.MesServiceClient.GetGroupByShift(String EquipmentID, DateTime CurDate, String CurShift, String PlineName, String SiteName)
       at PCRGreentyreApplication.FormLogin.cb_shift_SelectedIndexChanged(Object sender, EventArgs e)

    配置文件的最大连接数我设置为1000 设置如下:

    <bindings>
          <netTcpBinding>
            <binding name="bd" closeTimeout="00:01:00" openTimeout="00:10:00"
              receiveTimeout="00:10:00" sendTimeout="00:05:00" transactionFlow="false"
              transferMode="Buffered" transactionProtocol="OleTransactions"
              hostNameComparisonMode="StrongWildcard" listenBacklog="1000" maxBufferPoolSize="2147483647"
              maxBufferSize="2147483647" maxConnections="1000" maxReceivedMessageSize="2147483647">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
              <reliableSession ordered="true" inactivityTimeout="00:10:00"
                enabled="false" />
              <security mode="None">
                <transport clientCredentialType="None" protectionLevel="None" />
                <message clientCredentialType="None" />
              </security>
            </binding>
          </netTcpBinding>

    <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="2147483647" />

        </bindings>

     

    wcf的连接模式配置如下

     [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall , ConcurrencyMode = ConcurrencyMode.Multiple, IncludeExceptionDetailInFaults = true)]

    问一下高手,有没有什么好的解决办法?


    2011年8月8日 4:47

答案

全部回复

  • 这提示是内存不足,你检查下是不是内存出现了泄露,你每次实例化的Client实例 有关闭吗?Client.Close()或者使用Using体进行声明?
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年8月8日 14:05
    版主
  • 你是程序启动后运行了一段时间抛出这样的异常还是刚开始运行就抛出这样的异常? 从报错信息上看是内存不够了,如Frank所说,你要把用过的instance显式关掉或者写在using(....) {....}中。 还有,检查你的缓存和maxsend, maxreceive, maxpreread等几个值设置的是否合理。纯粹猜测,仅供参考。
    做一名有着良好修养的程序员.....
    2011年8月9日 1:31
  • 客户端内存1G 什么都没有装xp系统就跑一个client 应该不是内存不足的问题,今天修改了程序所有client调用后都close(),出现异常后abort(),这样应该不存在instance异常的情况了吧!程序刚换上还没有看到效果,不知道什么原因会引起这样的问题,大家讨论一下。 还有就是异步调用wcf 异常扑捉的问题,版主有什么好的方法么???我是用一个返回字符串判断,不知道还有没有别的方法,wcf刚学,很多地方还不是特别清楚希望加深理解。
    2011年8月9日 6:27
  • InsufficientMemoryException 这种异常是进行实例化前检查内存不够时报的异常,既然是报异常了应该还是内存不够,所以先前跟你说close instance应该是不能解决问题的,因为还没有实例化。你说程序还没有看到效果就报出这样的问题,应该还是内存小的问题,程序初始化时内存不够启动不起来。个人建议你可以从以下几个方面去测试一下:1》把虚拟内存调大一些,比如暂时调为1.5G或者2G。2》推迟实例化一些对象,试试程序能不能启动成功,3》如果你不需要从数据库读取大量的数据可以暂不设置缓存池的大小,暂时去掉或者设小一些。再试试能不能启动成功。这样分步骤来确定root cause是什么。
    Frank,您老赶快显灵吧,别老看片儿了,给这位仁兄探讨一下捕捉异步调用WCF异常的问题。


    做一名有着良好修养的程序员.....
    2011年8月9日 7:23
  • 我感觉和客户端得内存大小没有关系,我的客户端程序启动起来共占用内存50m左右,基本没有什么变化,我感觉还是wcf服务连接不上的问题,异步调用异常我用一个返回值获得,别的方法暂时还不知道怎么弄,希望大家集思广益,一起讨论,开会去了,明天讨论。
    2011年8月9日 8:09
  • 老外遇到这个问题,微软回复的说是OS操作系统的问题,不是WCF的问题。

    你尝试更新一下系统补丁,再试试。

    下面是相关问题的讨论链接

    http://connect.microsoft.com/wcf/feedback/details/420151/insufficient-winsock-resources-available-to-complete-socket-connection-initiation

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/39d413e8-8c11-4a75-8672-2242806c3266/


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年8月9日 12:36
    版主
  • 问一下版主,[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall , ConcurrencyMode = ConcurrencyMode.Multiple, IncludeExceptionDetailInFaults = true)]  这种配置前如果其中一个客户端调用wcf 出现错误了,会不会影响后面的调用。大家多讨论,才能了解的更加全面。

    2011年8月10日 2:05
  • Hi,


    关于Insufficient winsock resources available to complete socket connection initiation异常,你可以参考下面这个英文帖子。

    http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/41919510-3acf-4c20-bf18-33181d662c07

    InstanceContextMode = InstanceContextMode.PerCall说明新的InstanceContext对象在每次调用前创建,在调用后回收。因此,客户端调用WCF出现错误,不会影响后面的调用。它不像InstanceContextMode.Single,只有一个 InstanceContext 对象用于所有传入呼叫,并且在调用后不回收,如果客户端调用出现错误会影响后面的调用。


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework
    2011年8月15日 1:59
    版主