【问题标题】:WCF client error "Insufficient winsock resources available" after around 2 hours大约 2 小时后,WCF 客户端错误“可用的 Winsock 资源不足”
【发布时间】:2011-11-07 11:11:58
【问题描述】:

系统说明:我有一个 WCF 服务(自托管在 Windows 服务中),由客户端(也是 Windows 服务)使用。这两个应用程序旨在具有恒定的正常运行时间。 “队列”应用程序从数据库中读取条目,将“作业”发送到 WCF 服务进行处理,该服务将一些信息返回给客户端,客户端将结果存储回数据库中。

错误详情:大约两个小时后,客户端应用程序无法再连接到报告错误的 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 类的类?有没有更简单的方法来调试/记录客户端或 WCF 服务的当前状态(我已附加 perfmon.exe,但它并没有真正提供有关套接字/网络方面的太多有用信息)。

谢谢

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

【问题讨论】:

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

标签: wcf winsock


【解决方案1】:

我在使用 Windows Server 2008 R2 SP1 时遇到了非常相似的情况。一段时间以来一直在进行故障排除和研究。找到了一篇听起来一模一样的支持文章。

这也可能是您的解决方案:

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

有一个修补程序。

文章中描述的症状:

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

原因如文章所述:

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

更新:我已经通过升级一台服务器而不是另一台服务器来验证该修补程序确实为我解决了这个问题。并排运行它们,没有修补程序的服务器遇到了 WinSock 问题,而具有修补程序的服务器仍在重新播种 49-50k 范围内的源端口。

【讨论】:

    【解决方案2】:

    你在运行什么平台? Win2k3,Win2k8?我在网络上看到了未经证实的报告,其中有一些应用程序在 Win2k8 之前的系统上运行时遇到了类似的问题,这些问题“解决”了在 Win2k8 上运行的问题。此外,如果客户端和服务器在同一系统上运行,是否可以使用命名管道绑定与 nettcp?不是真正的修复,但可能会解决您的特定问题。

    【讨论】:

    • 我在 Win Server 2k8 R2 上运行它。我已将它转换为使用命名管道绑定而不是 nettcp,它工作正常。不知道是什么原因。部分解决方案。
    猜你喜欢
    • 2014-08-02
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多