大约2小时后WCF客户端错误“可用的winsock资源不足”

时间:2011-11-07 11:11:58

标签: wcf winsock

系统描述:我有一个客户端(也是一个Windows服务)使用的WCF服务(在Windows服务中自托管)。这两个应用程序旨在实现持续的正常运行时间。 'queue'应用程序从数据库中读取条目,将'jobs'发送到WCF服务进行处理,将一些信息返回给客户端,客户端将结果存储回DB中。

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

“可用于完成套接字连接启动的winsock资源不足。”

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

“建立与SQL Server的连接时发生与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。验证实例名称是否正确以及SQL Server是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)“

第二个应用程序与WCF客户端和服务器无关,它只在同一台服务器上运行,只是读取/写入数据库。

服务器/客户端设置/代码:

服务器详细信息:

  • 自我托管在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);
}

可能的解释: 我认为基于第一个异常错误,代码没有关闭/释放套接字连接或用尽连接的端口(请注意我从ClientProcess显式调用ClientBase的Close()方法,除了实现ClientBase上的Dispose()方法。

注意:客户端应用程序是多线程的,最多有4个并发线程同时运行,每个线程都调用WCF服务。 WCF服务的客户端完全正常工作,直到客户端进程随后吐出错误的2小时(ish)点,其他(不相关的)Windows服务(使用网络资源)也开始吐出错误。

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

由于

更新:我实际上已经将 ClientConnectionClass 包装成'using'语句,我目前正在测试它(通常需要2个小时)。 更新,这不起作用。

2 个答案:

答案 0 :(得分:2)

我使用Windows Server 2008 R2 SP1遇到了非常类似的情况。一直在进行故障排除和研究。找到一篇听起来很像它的支持文章。

这也可能对你有所帮助:

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

有一个修补程序。

文章中描述的症状:

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

原因如文章所述:

“出现此问题的原因是WinSock(Afd.sys)的辅助功能驱动程序中的竞争条件导致套接字泄漏。随着时间的推移,如果所有可用套接字都出现”症状“部分中描述的问题资源已经耗尽。“

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

答案 1 :(得分:0)

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