gpt4 book ai didi

大约 2 小时后 WCF 客户端错误 "Insufficient winsock resources available"

转载 作者:行者123 更新时间:2023-12-04 18:30:26 24 4
gpt4 key购买 nike

系统说明:我有一个由客户端(也是 Windows 服务)使用的 WCF 服务(自托管在 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 小时)。 更新 ,这没有用。

    最佳答案

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

    这对你来说也可能是一个修复:

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

    有一个修补程序。

    文章中描述的症状:

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

    原因如文章所述:

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

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

    关于大约 2 小时后 WCF 客户端错误 "Insufficient winsock resources available",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035646/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com