我将这个例子用于我的wcf服务: http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx?msg=3713905#xx3713905xx
但如果服务器停止,客户端就不会得到它......
该示例处理它:
proxy.Open();
proxy.InnerDuplexChannel.Faulted +=
new EventHandler(InnerDuplexChannel_Faulted);
proxy.InnerDuplexChannel.Opened +=
new EventHandler(InnerDuplexChannel_Opened);
proxy.InnerDuplexChannel.Closed +=
new EventHandler(InnerDuplexChannel_Closed);
void InnerDuplexChannel_Closed(object sender, EventArgs e)
{
if (!this.Dispatcher.CheckAccess())
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new FaultedInvoker(HandleProxy));
return;
}
HandleProxy();
}
void InnerDuplexChannel_Faulted(object sender, EventArgs e)
{
if (!this.Dispatcher.CheckAccess())
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new FaultedInvoker(HandleProxy));
return;
}
HandleProxy();
}
但是,如果我停止主机或它崩溃(ALT + F4),客户端不会得到它。 connectionstate仍处于“连接”状态。
答案 0 :(得分:2)
问题位于底层TCP协议中。 当连接意外死亡时,TCP不会立即通知对方。 通常在小时范围内有超时,您最终可以在使用的TCP堆栈中进行配置 - 在Windows注册表中的某个位置。但我不建议这样做,因为它会影响整个机器。
但是当您下次尝试在该不存在的连接上发送数据时,您将收到错误。
因此,如果您想知道您的连接是否仍然存在,则必须定期发送一条小消息。