在我的客户端/服务器应用程序中,我希望单个双工 WCF 通道可用于与其服务器进行通信 - 一种后台连接,对于客户端应用程序运行来说不是绝对必要的,但对于向服务器报告状态是可取的. 我分别在和中有一个Ping()
呼叫和Echo()
回调。IServerContract
IClientContract
我class ServerProxy : System.ServiceModel.DuplexClientBase<IServerContract>
使用传递方法来实现base.InnerChannel
.
如果我var proxy = new ServerProxy(...)
在我的客户端中创建,我可以开始调用proxy.Ping()
,WCF 将自动打开第一次调用的连接并在之后立即执行操作调用。但是,由于通道初始化和身份验证,第一次调用总是需要大约 10 秒。(我正在使用 Windows 身份验证、基于消息的安全性、EncryptAndSign。)后续调用更快。
我相信这 10 秒是不可避免的,但通常在客户端第一次调用服务器之前有一段时间可能会发生这种初始化。因此,我没有等待 的自动打开功能DuplexClientBase
,而是通过致电 来提前打开频道proxy.InnerDuplexChannel.Open()
。(proxy.Open()
抛出一个异常,这种间接性似乎避免了它。)
不幸的是,验证客户端到服务器通道不会同时验证服务器到客户端回调通道。相反,服务器对客户端的第一次调用也需要大约 10 秒。由于我使用的是 netTcp 绑定,因此对此我感到很惊讶,但我认为这是可以预料的。
如何也可以抢先打开回调通道?
我可以要求客户端调用一些Login()
方法,但我不认为 WCF 应该严格要求在用户代码知道连接的客户端之前进行操作!
提示(?):我想这段代码必须放在 WCF 管道/生命周期中的某个位置,服务器有机会对客户端连接的事件执行自定义操作(并且在传输任何操作消息之前)。到目前为止,我一直没有找到这个集成点。