我在检查WCF连接是否已打开时遇到问题。我的WCF连接是双向的。我使用State属性来检查客户端的连接状态。我的功能:
private bool ConnectionIsOpen()
{
if (m_Service != null && (m_Service.State | CommunicationState.Opened) == CommunicationState.Opened)
{
return true;
}
return false;
}
我创建了一个服务,它是一个每10秒运行一次的线程来检查连接的状态。我使用ConnectionIsOpen()方法进行检查。在Windows XP上运行一切都很顺利。但是在Windows 7上运行时会出现问题。
当我拔出网线以创建断开连接时,如果在Windows XP上运行应用程序,检查连接的状态是否为“故障”,但如果在Windows 7上运行,则检查连接“状态是否仍然打开。”
在这种情况下,任何人都可以帮助我检查连接是否已打开。感谢。
答案 0 :(得分:4)
这将永远是true
:
(m_Service.State | CommunicationState.Opened) == CommunicationState.Opened
示例,m_Service.State
= 0:
0 | CommuncationState.Opened
== CommuncationState.Opened
您想改用&
(AND)。
答案 1 :(得分:3)
我们在自己的系统中遇到了类似的问题;断开网络电缆或将客户端计算机或服务器置于睡眠模式不会产生通道故障。
据我所知,似乎连接状态仅指示最后一次调用后的连接状态,而不是当前连接状态。了解当前状态的唯一方法是实际调用该服务。
如果您的客户端不需要经常调用该服务,但必须在连接丢失时做出反应,一种解决方案是在客户端实现虚拟调用,该调用会定期轮询服务。如果在进行虚拟呼叫时连接不可用,您将收到一个可以处理的通道故障。
问题是你不能简单地使用虚拟呼叫来保证下一次服务调用能够正常工作:
public void SomeMethode()
{
if (ConnectionIsOpen())
{
m_Service.Dummy();
// Connection is lost here
m_Service.SomeMethode();
}
}
为了解决这个问题,我们实现了一个系统,该系统自动重新执行任何失败的服务调用,这些调用在恢复连接后会产生通道故障。
答案 2 :(得分:2)
确认通信状态是否开放的最佳和最佳方式是调用Faulted事件,如下所示:
proxyInstance.InnerChannel.Faulted -= new EventHandler(ProxyChannelFaulted);
但这仅适用于那些支持ReliableMessaging的绑定,如WsHttpBinding。
有关详细信息,请参阅链接:WCF Proxy Client taking time to create, any cache or singleton solution for it
谢谢, Jai Kumar
答案 3 :(得分:0)
您在Windows 7上获得完全不同的结果这一事实并不令人惊讶。 Microsoft使用windows vista完全重新设计了TCP堆栈,因此其功能与核心网络功能中的xp完全不同。
我要做的第一件事是使用wireshark来查看实际穿过电线的内容。拔出插头时,查看TCP连接是否实际终止。如果连接快速恢复,Windows可能正在进行某种连接持久性/缓冲。