简短版本: 当我在使用双工通信的客户端上使用ChannelFactory创建频道时,是否需要保持频道开放才能接收回叫,或者我可以调用ChannelFactory.Close()吗?
长版: 我正在开发我的第一个WCF服务,并且我已经创建了自己的ClientProxy类,它实现并将一些不同的服务合并为一个。我使用ChannelFactory来创建每个通道,我在网上的一般读数表明我应该缓存ChannelFactory,但我只应该在需要时打开和关闭实际通道。
所以我调用ChannelFactory.Open来打开一个频道并执行双工操作(一个单向操作,后来调用一个回调)。我应该在请求操作后通过调用ChannelFactory.Close关闭此频道,如果我这样做,我还会收到回调吗?
基本测试似乎表明如果我关闭连接,我将收到回调,但我只是想确定。此外,这种缓存ChannelFactory的方法是否正确?
由于
答案 0 :(得分:4)
您希望在接收回拨时保持客户端代理处于打开状态,完成后您应该关闭该频道。
以下是Juval Lowy编写的WCF服务的好书(我建议你阅读关于回调的整章):
5.3.4。回调连接管理
回调机制不提供更高级别的协议,用于管理服务和回调端点之间的连接。开发人员需要提供一些应用程序级协议或一致的模式来管理连接的生命周期。如前所述,如果客户端通道仍处于打开状态,服务只能回调客户端,通常是通过不关闭代理来完成的。保持代理打开也会阻止回调对象被垃圾回收。如果服务在回调端点上维护引用并且客户端代理关闭或客户端应用程序本身消失,则当服务调用回调时,它将从服务通道获得ObjectDisposedException。因此,当客户不再希望接收回叫或客户端应用程序正在关闭时,最好通知服务。为此,您可以向服务合同添加显式Disconnect()方法。由于每个方法调用都带有回调引用,因此在Disconnect()方法中,服务可以从其内部存储中删除回调引用。