关闭WCF持久连接时遇到问题。我不仅需要关闭一个对象,还需要关闭已建立的TCP连接。
我有什么:
许多可以创建WCF连接的客户端:
var binding = new BasicHttpBinding
{
CloseTimeout = TimeSpan.FromMinutes(30),
ReceiveTimeout = TimeSpan.FromMinutes(30),
SendTimeout = TimeSpan.FromMinutes(30),
OpenTimeout = TimeSpan.FromMinutes(30)
};
var endpointAddress = new EndpointAddress(comboBoxPath.Text);
_factory = new ChannelFactory<IManagementService>(binding, endpointAddress);
_multimodeService = _factory.CreateChannel();
Load Balancer with 2 servers。
我需要的是从LB中删除一台服务器后重新创建一个WCF连接。案例:许多客户通过LB与两台服务器建立持久连接。我想从LB中排除一个服务器,更新它并将其返回,但所有客户端必须在更新期间与其他服务器一起使用。因此,当我从LB中排除服务器并开始更新时,所有使用第一台服务器的客户端都开始出错。他们尝试重新创建WCF连接,但他们不能,因为我无法关闭持久的WCF连接,LB继续向第一台服务器发送请求。如果我可以完全关闭连接并创建一个新的LB,则会向第二个服务器发送请求。
我尝试创建一个小型测试应用程序来建立WCF连接,并通过一个小实用程序CurrPorts查看它。当我从服务器获取数据时,我看到了连接,但是我关闭连接的所有尝试均未成功。我绑了
((ICommunicationObject)_multimodeService).Close();
((ICommunicationObject)_multimodeService).Abort();
((IClientChannel)_multimodeService).Close();
((IClientChannel)_multimodeService).Abort();
_factory.Close();
_factory.Abort();
但它只是在代码中处理对象。因此,在通过任何此操作关闭连接后,我无法获取数据,直到我再次打开连接,但已建立的TCP连接仍处于活动状态,并在创建新连接后重新使用。仅在关闭应用程序后才会将其删除。 所以问题是:是否可以完全关闭包括TCP连接在内的持久连接?</ p>
注意:我了解ChannelFactory中的缓存并尝试设置属性
ClientBase<IManagementService>.CacheSetting = CacheSetting.AlwaysOff;
在申请开始时,但它也没有帮助。 我的框架版本是4.6.2。