2

简短版本:当我在使用双工通信的客户端上使用 ChannelFactory 创建通道时,是否需要保持通道打开才能接收回调,或者我可以调用 ChannelFactory.Close()?

长版:我正在开发我的第一个 WCF 服务,并且我创建了自己的 ClientProxy 类,它实现了几个不同的服务并将其合并为一个。我使用 ChannelFactory 来创建每个通道,我在网上的一般阅读表明我应该缓存 ChannelFactory,但我应该只在需要时打开和关闭实际通道。

所以我调用 ChannelFactory.Open 来打开一个通道并执行一个双工操作(单向操作,后来调用回调)。我是否应该在请求操作后通过调用 ChannelFactory.Close 来关闭此频道,如果我这样做了,我还会收到回调吗?

基本测试似乎表明,如果我关闭连接,我将收到回调,但我只是想确定一下。另外,这种缓存 ChannelFactory 的方法是否正确?

谢谢

4

1 回答 1

4

当您希望接收回调时,您应该保持客户端代理打开,完成后您应该关闭通道。

以下是 Juval Lowy 的《Programming WCF Services》一书的引述(我建议您阅读有关回调的整章):

5.3.4. 回调连接管理

回调机制提供的服务与管理服务和回调端点之间的连接没有什么类似的高级协议。开发人员需要提出一些应用程序级协议或用于管理连接生命周期的一致模式。如前所述,服务只能在客户端通道仍然打开的情况下回调客户端,通常通过不关闭代理来完成。保持代理打开也将防止回调对象被垃圾收集。如果服务在回调端点上维护了一个引用,并且客户端代理已关闭或客户端应用程序本身已消失,则当服务调用回调时,它将从服务通道获得 ObjectDisposedException。因此,当客户端不再希望接收回调或客户端应用程序正在关闭时,最好通知服务。为此,您可以在服务契约中添加一个显式的 Disconnect() 方法。由于每个方法调用都带有回调引用,因此在 Disconnect() 方法中,服务可以从其内部存储中删除回调引用。

于 2008-12-26T19:21:21.330 回答