每次调用服务应用程序后,在客户端关闭通道

时间:2012-10-19 14:17:15

标签: wcf wcf-client duplex-channel

我开始使用WCF处理客户端 - 服务器分布式应用程序。客户端还应该向服务器发送请求,因此我选择使用NetTcpBinding实现双工操作,因为所有客户端都将位于同一个Intranet上。

在服务器端,对于实现服务器合同的服务类,我使用这些设置

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]

每次初始化客户端时,我都会创建一个通过在Visual Studio中使用'Add service reference'选项添加服务而生成的代理类实例。初始化代理后,我向服务器发送Connect消息:

 _proxy.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);
 _proxy.InnerChannel.Closing += new EventHandler(InnerChannel_Closing);
 //send a connect message to the server
 _proxy.ClientConnected(ClientHostName, Version, ClientID, ClientIP); 

现在,服务器通过

引用了连接的客户端
OperationContext.Current.GetCallbackChannel<IClientEvents>()

这很直接,没什么特别的。但是,在服务器上线后让客户端重新连接到服务器时遇到了一些麻烦。在我的场景中,我将有多达50-100个客户端连接到服务器,他们很少与服务器通信,平均而言,每小时1个请求。

我想要实现的是让客户端在离线状态下“挂起”,为此我尝试在每次通道最终处于Faulted状态时重新初始化客户端的通信通道,好。但是当我尝试关闭服务器时,我收到以下消息

This could be because a client failed to close a sessionful channel within the required time.  

我现在正在努力为我的场景找到最合适的实现:

  1. 服务电话后未关闭频道。这样,一旦与服务器的连接断开(例如1分钟的间隔),客户端将总是尝试重新创建信道。尽管保持频道一直打开没有多大意义,所以我对这种方法不太确定。
  2. 每次通话后关闭频道,并在对服务器进行新呼叫时重新创建。这在进行服务调用时工作正常,但如果服务器想要向客户端发送通知会发生什么?服务器端的回调引用将不再有效,我必须等待客户端发送新的连接消息以获取新的回调引用,对吧?在这种情况下,我是否应该定期对服务器进行类似于Ping()的不同调用,以确保服务器始终可以联系客户端?
  3. 我还在阅读有关WCF双工操作的资料,但是无法确定哪种方法更好,以便我以后不会遇到问题。

    感谢您的建议!

0 个答案:

没有答案