2012-04-12 137 views
3

我有一个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声明中?有人知道我可以如何调试/诊断出现问题的位置?

感谢

回答

1

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

这意味着WCF服务代理不会释放资源,直到对Close()或Abort()的调用成功完成为止。看看blog post这个选项来正确关闭代理实例。

+0

虽然我很确定'Close()'每一次都确实成功了,所以根据你刚刚说的'应该'没有插槽。 – user989056 2012-04-14 23:16:54