2

我有以下代码:

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 和 Channel 本身,它们也会打开连接。我知道这一点,因为在性能测试中,调用在第 10 次调用时开始超时,如果我在命令行中执行 netstat -a,我可以看到在我的本地机器和它自身之间的端口 80 上打开了一大堆套接字。

如何让代理关闭其套接字?

4

2 回答 2

2

问题出在服务器端。每个服务实例都有一个 signal-R 客户端泄漏,它用完了可用的套接字。

发生这种情况时,客户端无法再连接。

提示其他人调试类似的东西:查看您的服务器,看看它是否没有构建某种 WCF 客户端并且没有清理它们。泄露它的症状是在客户端进程终止后,使用 netstat -a 看到的套接字仍保持在 ESTABLISHED 状态。

于 2012-05-02T21:34:13.660 回答
0

不幸的是,Microsoft 在 WCF 中实现服务代理(IClientChannel及其继承者)的方式允许在 Close/Dispose 方法中发生异常。发生这种情况时,您必须调用 Abort 方法来释放非托管资源(在您的情况下为 TCP 套接字)。查看有关此问题的简短博客文章并实现它描述的处置模式而不是using语句。

于 2012-05-01T19:21:55.823 回答