0

在客户端,我处理代理状态,以便当它的 State==CommunicationState.Faulted 时,它会自动调用 Abort() 并优雅地转换到 CommunicationState.Closed。在服务器端,我有 2 个事件连接到回调通道

OperationContext.Current.Channel.Faulted += Channel_Faulted; OperationContext.Current.Channel.Closed += Channel_Closed;

这是我的活动代码

private void Channel_Closed(object sender, EventArgs e)
{
    var callback = sender as IPtiCommunicationCallback;
    PtiClient client;
    lock (syncObj)
    {
        client = clientsList.FirstOrDefault(x => x.Value == callback).Key;
    }
    if (client != null)
    {
        //Code to remove client from the list
        Disconnect(client);
    }
}

private void Channel_Faulted(object sender, EventArgs e)
{
    (sender as ICommunicationObject).Abort();
}

现在的问题是:双工通道(回调通道)的状态是否会自动转换为客户端的状态,或者我必须像我一样处理故障状态?顺便说一句,我正在使用 NetTcpBinding。

4

2 回答 2

0

回调通道的状态通常会模仿客户端的状态,但这并不能保证。例如,如果客户端试图到达服务器以关闭连接,它的状态可能是Closing,而服务器端的状态可能是Opened。假设每一方都必须单独处理ClosedFaulted声明,您正在正确处理它。

于 2013-08-14T20:12:10.507 回答
0

我对我们应该使用哪种绑定进行了一些研究,最后决定继续使用 nettcp 绑定。详细解释见我的博客。

http://maheshde.blogspot.com.au/2013/06/duplex-communication-over-internet.html

我不知道为什么这些事件没有被触发。但是每 10 分钟触发一次来自客户端的 WCF 调用,我们的问题就解决了。

于 2013-08-16T00:28:44.447 回答