在我的客户端/服务器应用程序中,我希望单个双工WCF通道可用于与其服务器进行通信 - 这种背景连接对于客户端应用程序运行并不是绝对必要的,但是对于报告状态是可取的到服务器。我分别在Ping()
和Echo()
进行了IServerContract
来电和IClientContract
回调。
我使用pass-thru方法将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()
throws an exception这种间接似乎可以避免它。)
不幸的是,验证客户端到服务器通道不也验证服务器到客户端的回调通道。相反,服务器对客户端的第一次调用需要大约10秒。由于我使用的是netTcp绑定,我对此感到惊讶,但我认为现在可以预料到它。
如何以抢先的方式打开回调频道?
我可以要求客户端调用一些Login()
方法,但我不相信WCF在用户代码可以知道连接的客户端之前应该严格要求操作!
提示(?):我想这个代码必须放在WCF管道/生命周期中的某个位置,服务器有机会在客户端连接的事件上执行自定义操作(并且在发送任何操作消息之前)。到目前为止,这个整合点一直困扰着我。