大约2小时后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个小时).更新,这不起作用.

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

点赞