我有一个WCF服务托管在IIS 7上,它运行成功一段时间,然后无法与其他网络位置通信(我怀疑没有TCP可用于连接到外部世界港口)IIS托管的WCF服务没有回收TCP端口“winsock资源不足”
后台应用程序的:
我的系统转码大的媒体文件(这需要时间)。我有一个集中托管的WCF服务,位于服务器A上 - 将被称为“中央WCF服务”。然后,我有许多客户端服务在不同的服务器上进行媒体文件的实际转码:B,C,D,E,F等 - 这些服务将被称为“客户端处理器服务”。中央WCF服务管理'代码转换作业'发送到哪个客户端处理器服务进行处理。这些客户端处理器服务中的每一个都是自托管的WCF服务,它们基本上执行长时间运行的进程,并由中央WCF服务检查作业进度百分比进行轮询。因此,中央WCF服务为这些客户端提供了很多连接,以便轮询他们的工作进展,对每个客户端大约每2-3秒进行一次轮询。
中央WCF服务存储客户端处理器服务的地址的字符串列表。这是用于轮询每个客户端的代码descrbied以下(精简版):
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方法。通信允许IN,但不能从服务器OUT。感兴趣
几点:
到服务器的连接,可以进行故障状态,而不是从服务器。
我的每个服务(中央WCF服务和客户端处理器服务)都是单例实例。
中央WCF服务在IIS 7托管和应用程序池回收被禁用
不幸的是命名管道是不是一个选项(客户端和服务器在不同的机器上)
我的想法/问题
所有迹象都指向服务器用尽TCP套接字。我是否正确设置了WCF ClientProcessorClient
?我是否妥善处理它们?我是否需要将它们包装在using
声明中?有人知道我可以如何调试/诊断出现问题的位置?
感谢
虽然我很确定'Close()'每一次都确实成功了,所以根据你刚刚说的'应该'没有插槽。 – user989056 2012-04-14 23:16:54