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

WCF客户端错误“;可用winsock资源不足”;大约2小时后,wcf,winsock,Wcf,Winsock,系统描述:我有一个WCF服务(在windows服务中自托管),由客户端(也是windows服务)使用。这两个应用程序设计为具有恒定的正常运行时间。“队列”应用程序从数据库读取条目,将“作业”发送到WCF服务进行处理,WCF服务将一些信息返回给客户端,客户端将结果存储回数据库 错误详细信息:大约两小时后,客户端应用程序无法再连接到报告错误的WCF服务: “可用winsock资源不足,无法完成套接字连接启动。” 在同一服务器上运行的第二个应用程序也从此时起开始抛出异常: “建立与SQL Server

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

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

“可用winsock资源不足,无法完成套接字连接启动。”

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

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

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

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

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();
            }
        }
    }
 }
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);
}
服务器详细信息:

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();
            }
        }
    }
 }
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);
}
  • 在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();
            }
        }
    }
 }
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);
}
可能的解释: 我认为基于第一个异常错误,代码没有关闭/释放套接字连接,也没有用完要连接的端口(请注意,除了在ClientBase上实现Dispose()方法外,我还从ClientProcess显式调用ClientBase的Close()方法)

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

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

谢谢


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

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

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

这可能也是一个解决方案:

有一个热修复程序

文章中描述的症状:

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

原因如本文所述:

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


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

我的直觉将取决于您的线程。请尝试运行第1个阅读并了解我在Win Server 2k8 R2上运行此操作的原因。我已将其转换为使用namedpipe绑定而不是nettcp,并且工作正常。不知道原因是什么。部分解决方案。