我开始使用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.
我现在正在努力为我的场景找到最合适的实现:
我还在阅读有关WCF双工操作的资料,但是无法确定哪种方法更好,以便我以后不会遇到问题。
感谢您的建议!