我有以下代码:
using (var fact = new WebChannelFactory<IService<Message>>(binding,
commsSettings.MessageEndPoint()))
{
using (IDisposable channel = (IDisposable)fact.CreateChannel())
{
service = (IService<Message>)channel;
service.Create(AlertMessage);
((IClientChannel)channel).Close();
}
fact.Close();
}即使我正在处理WebChannelFactory和通道本身,它们仍然使连接保持打开状态。我之所以知道这一点,是因为在性能测试中,调用在第10次调用时开始超时,如果我在命令行执行netstat -a,我可以看到在我的本地计算机和它自己的端口80之间打开了一大堆套接字。
如何使代理关闭其套接字?
发布于 2012-05-03 05:34:14
问题出在服务器端。我们的每个服务实例都有一个signal-R客户端泄漏,这耗尽了可用的套接字。
当这种情况发生时,客户端将无法再进行连接。
给其他调试类似东西的人一个提示:看看你的服务器,看看它是不是在构造某种WCF客户端,而不是清理它们。暴露它的症状是,在客户端进程终止后,使用netstat -a看到的套接字仍然保持在已建立的状态。
发布于 2012-05-02 03:21:56
不幸的是,微软在WCF中实现服务代理(IClientChannel及其继承者)的方式允许在Close/Dispose方法中发生异常。发生这种情况时,必须调用Abort方法来释放非托管资源(在本例中为TCP套接字)。在这个问题上查看此brief blog post,并实现它所描述的dispose模式,而不是using语句。
https://stackoverflow.com/questions/10402703
复制相似问题