IIS托管WCF服务不回收TCP端口“winsock资源不足”

时间:2012-04-12 12:39:55

标签: wcf web-services iis-7 nettcpbinding

我在IIS 7上托管的WCF服务成功运行了一段时间,然后无法与其他网络位置通信(我怀疑没有可用于连接外部世界的TCP端口)

申请背景:

我的系统转码大型媒体文件(需要时间)。我有一个集中托管的WCF服务,它位于服务器A上 - 将被称为“中央WCF服务”。然后,我有许多客户端服务,它们对不同服务器上的媒体文件进行实际转码:B,C,D,E,F等 - 这将被称为“客户端处理器服务”。中央WCF服务管理发送“转码作业”的客户端处理器服务以进行处理。这些客户端处理器服务中的每一个都是自托管WCF服务,它们基本上执行长时间运行的过程,并通过中央WCF服务检查作业进度百分比进行轮询。因此,中央WCF服务打开了许多与这些客户端的连接,以便轮询他们的工作进度,每个客户端大约每2-3秒进行一次轮询。

中央WCF服务存储客户端处理器服务的地址字符串列表。下面将描述用于轮询每个客户端的代码(剥离版本):

public ClientProcessorClient getClientByaddress(string address)
{
    Binding bidning = new NetTcpBinding(SecurityMode.None);
    return new ClientProcessorClient(bidning, new EndpointAddress(address));
}

public void pollJobs()
{
    foreach (string clientAddress in clients)
    {
        ClientProcessorClient client = getClientByaddress(clientAddress);
        int progress = client.GetProgress();
        client.Close();
        // Do stuff with progress
    }
}

休息时会发生什么:

我可以向中央WCF服务提交许多转码作业,并将作业提交给客户端成功更新进度等。经过大约一个小时的处理后,托管中央WCF服务的服务器停止正常工作。尝试联系客户端WCF服务时,中央WCF服务Insufficient winsock resources available to complete socket connection initiation.会引发错误。客户端WCF服务都可以从我本地计算机上运行的WCF测试客户端进行ping操作。另外我注意到,在这种状态下,服务器无法查看网络文件资源 - 我已远程登录并尝试查找网络附加存储文件夹,但无法连接。然而,我可以拨打该服务器,例如我可以打开一个WCF测试客户端并连接到中央WCF服务并调用它的ping方法。允许通信但不是来自服务器的OUT。

很少有兴趣点

在故障状态下,可以建立与服务器的连接,但不能从服务器建立连接。

我的每个服务(中央WCF服务和客户端处理器服务)都是单例实例。

中央WCF服务托管在IIS 7中,应用程序池回收已禁用

不幸的是,命名管道不是一个选项(客户端和服务器在不同的机器上)

我的想法/问题

所有迹象都表明服务器耗尽了TCP套接字。我是否正确设置了WCF ClientProcessorClient?我是否正确处理它们?我需要将它们包装在using语句中吗?有谁知道如何调试/诊断出现问题的地方?

由于

1 个答案:

答案 0 :(得分:1)

无论好坏,Microsoft决定实现WCF服务代理逻辑(ClientBase或直接来自ChannelFactory)以允许在Close()方法中抛出异常。我相信所有的Dispose()方法都是调用Close(),但我从未尝试过查看源代码。如果代理处于故障状态,则必须调用Abort()以释放资源(例如TCP会话)。

这意味着在对Close()或Abort()的调用成功完成之前,WCF服务代理不会释放资源。请查看此blog post以获取正确关闭代理实例的一个选项。