2

我将此示例用于我的 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),客户端不会得到它。连接状态仍然是“已连接”。

4

1 回答 1

2

问题在于底层的 TCP 协议。当连接意外终止时,TCP 不会立即通知对方。通常有几个小时的超时,您最终可以在使用的 TCP 堆栈中配置 - 在您的情况下,在 Windows 注册表中的某个位置。但我不建议这样做,因为它会影响您的整台机器。

但是,当您下次尝试在该不存在的连接上发送数据时,您会收到错误消息。

因此,如果您想知道您的连接是否仍然存在,您必须定期发送一条小消息。

于 2010-12-29T18:01:28.697 回答