2010-11-30 119 views
16

我有一个带有net.tcp DuplexChannel的WCF自托管服务。在服务器上我运行下面的断开客户端:WCF:如果服务器断开连接,我如何检测客户端

((ICommunicationObject)client.CallbackChannel).Close(); 

这工作得很好,但我怎么在客户端上检测到它已断开连接?

伊夫迷上了封闭式和断陷事件的回调均的InstanceContext和通道到服务器:

InstanceContext callback = new InstanceContext(callbackImp); 
callback.Closed += new EventHandler(callback_Closed); 

((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed); 

但没有任何工程。我从未收到通知。现在使用的解决方法是在回调中使用一种方法,而不是从客户端触发断开连接。但我宁愿不这样做。我特别不想让服务器等待用户断开连接。

EDIT

我刚刚意识到从客户端断开时,我运行在服务合同的方法,其标有IsTerminating =真:

[OperationContract(IsTerminating = true)] 
void Disconnect(); 

我想这将是在回调合同上呢?我尝试添加同样的方法来我的回调和它没有终止从服务器的角度来看,回调通道,但我仍然didnt上的客户端得到通知......怪异

编辑

我发现了一些这方面的详细信息:

当服务器中止回调 通道,故障旅行回到 客户端,客户端故障,我们得到 在客户端上发生故障的事件。

当服务器关闭回调 通道时,会话仍然打开 ,直到客户端发出关闭。

客户关闭频道 后,您会看到Closed事件。

根据这条语句,关闭事件并不是通过关闭服务器的回调通道来触发的,客户端也必须关闭它。所以我可以在回调的终止Disconnect方法中在客户端运行Close。或者我可以在回调服务器端使用Abort-method,并在回调中使用Disconnect方法。我不知道我坦率地说哪一个。 Hmmmm。

编辑

我去中止的方法。这似乎是最合乎逻辑的方法,它的运作非常好。客户端通过回调-conceptcontext上的Faulted事件得到通知。尼斯。

+0

看看这个我有同样的问题http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev 2011-02-26 08:53:45

回答

2

我去中止的方法。这似乎是最合乎逻辑的方法,它的运作非常好。客户端通过回调-conceptcontext上的Faulted事件得到通知。

1

您可以在关闭回叫通道之前简单地做一个回调,告诉客户您正在关闭通道。

因此,只要这行代码之前:

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

这不起作用 – Sentry 2017-09-28 16:32:37

相关问题