2011-11-07 33 views
4

系统描述:我有一个客户端(也是Windows服务)使用的WCF服务(自托管在Windows服务中)。这两个应用程序设计为具有恒定的正常运行时间。 '队列'应用程序从数据库中读取条目,将'作业'发送到WCF服务进行处理,然后将某些信息返回给客户端,然后客户端将结果存储回数据库。WCF客户端错误“可用的winsock资源不足”大约2小时后

错误详细信息:大约两个小时的客户端应用程序后无法再连接到WCF服务报告错误:

“不足winsock的可用资源来完成套接字连接初始化。”

它运行在同一台服务器上的第二个应用程序也开始从这个时候起抛出异常:

“,而与SQL Server建立连接时出现与网络相关的或特定于实例的错误服务器(提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)“

(错误:40 - 无法打开与SQL Server的连接)验证实例名称是否正确并且SQL Server已配置为允许远程连接。

第二个应用程序与WCF客户端和服务器无关,它只是运行在山姆e服务器,并简单地读/写数据库。

服务器/客户端安装程序/代码:

服务器详细信息:

  • 自Windows服务中托管。
  • NetTcpBinding的
  • receiveTimeout = “00:00:15”
  • serviceThrottling maxConcurrentCalls = “2147483647”
  • maxConcurrentSessions = “2147483647”

客户端连接类::

public class ClientConnectionClass : ClientBase<IFileService>, IFileService, IDisposable 
{ 

    public void callMethod(InputRequest request) 
    { 
     result = base.Channel.doRequest(request); 
    } 

    void Dispose() 
    { 
     bool success = false; 
     try 
     { 
      if (State != CommunicationState.Faulted) 
      { 
       Close(); 
       success = true; 
      } 
     } 
     finally 
     { 
      if (!success) 
      { 
       Abort(); 
      } 
     } 
    } 
} 

客户端进程(Windows服务):

while(true) 
{ 
    // Do some stuff before, code ommited 
    ClientConnectionClass ccc = new ClientConnectionClass(); 
    ccc.callMethod(inputRequest); 
    // Do some stuff with the response 
    // Close the connection class, is this the right way to close it? 
    ccc.Close(); 
    Thread.Sleep(1000); 
} 

可能的解释: 我认为,基于第一异常错误,代码不打烊/释放套接字连接或用完的端口上连接(请注意,我明确地调用Close ()方法,除了在ClientBase上实现Dispose()方法外)。

说明:客户端应用程序是多线程的,最多有4个并发线程同时运行,每个线程都调用WCF服务。客户端到WCF服务正在全面开展工作,直到客户端进程吐出错误的2小时(ish)点和其他(无关的)Windows服务(使用网络资源)也开始吐出错误。

可能的问题回答:我是创建/处置实现ClientBase类的类吗?有没有更简单的方法来调试/记录客户端或WCF服务的当前状态(我已经连接了perfmon.exe,但它并没有真正提供有关套接字/网络方面的有用信息)。

感谢

更新:我其实现在包裹ClientConnectionClass成“使用”声明,我目前正在测试的(这通常需要2小时)。 更新,这没有奏效。

+0

我的预感会在你的线上。尝试只运行一个线程,看看会发生什么 –

回答

0

你在运行什么平台? Win2k3,Win2k8?我在Win2k8上运行的Win2k8系统上运行的“解析”系统上遇到类似问题的应用程序的Web上看到了未经证实的报告。另外,如果客户端和服务器在同一个系统上运行,是否可以使用namedpipe绑定与nettcp?不是一个真正的修复,但可以解决您的特定问题。

+0

我在Win Server 2k8 R2上运行这个。我已经将它转换为使用namedpipe绑定而不是nettcp,它工作正常。不知道原因是什么。部分解决方案。 – user989056

4

我遇到了使用Windows Server 2008 R2 SP1的非常类似的情况。经过一段时间的排查和研究。找到一个听起来完全像它的支持文章。

这可能是你的修复,以及:

http://support.microsoft.com/kb/2577795

有它修补程序。

症状在文章中描述:

“请考虑以下情形: 您有运行Windows Server 2008 R2或Windows 7 的多处理器计算机在运行计算机上创建环回套接字的应用。 在这种情况下,应用程序可能无法创建新套接字,并且计算机上出现“无缓冲区空间可用”异常。此外,出现此问题时,用户无法远程连接到计算机,直到它重新启动。 。

“出现此问题的原因在的WinSock(Afd.sys中)的辅助功能驱动程序中的竞争条件,导致插座被泄露随着时间的推移,这是问题:在文章中描述

原因如果所有可用的套接字资源都用尽,则会出现“症状”一节中所述的问题。“

更新:我已通过升级一个服务器进行了验证,而不是另一个修复程序确实为我解决了问题。将它们并排运行,没有修补程序的服务器遇到WinSock问题,而带有此修补程序的服务器仍将其源端口重新设置在49-50k范围内。