【问题标题】:WCF Callback Interface - Who closes the channelWCF 回调接口 - 谁关闭通道
【发布时间】:2012-01-19 12:26:40
【问题描述】:

我在关闭回调/双工通信通道时遇到问题/疑问。 这是我的原型 WCF 接口:

[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))]
public interface IMyInterface
{
    [OperationContract]
    void StartWork();
}

public interface IMyInterfaceCallback
{
    [OperationContract(IsOneWay = true)]
    void WorkFeedback();
}

在客户端,我通过以下方式创建 WCF 接口:

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea);
IMyInterface myInterface = dcf.CreateChannel();

然后我在服务器端使用

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>();

检索回调指针,然后可用于与客户端通信。

我现在的问题是:

  1. 谁应该关闭通讯渠道?客户端或服务器
  2. 哪些通信对象需要关闭?原始接口 (IMyInterface) 或回调接口 (IMyInterfaceCallback) 或两者兼有。

我试图关闭服务器端的回调接口,在服务器知道它不会再做回调的时候。 然而,在回调接口上使用 ICommunicationObject::Close 会导致一分钟的阻塞操作。

在我看来,在客户端关闭不是正确的方式,因为客户端不知道是否有更多的回调可以预期。

感谢您的帮助。 弗兰克

附: 这似乎是一个非常基本的问题,但到目前为止,我在通过 google 或 stackoverflow 搜索时没有发现任何有用的信息......

【问题讨论】:

    标签: wcf


    【解决方案1】:

    DuplexChannel 在底层使用 TCP 连接,这就是它模拟双向通信的方式。但是,客户端始终打开该连接,因此它也负责关闭它(想想 TCP 套接字)。因此,您应该使用客户端接口 IMyInterface(派生自 IClientChannel)来关闭它。

    问候 巴勃罗。

    【讨论】:

      【解决方案2】:

      客户端应该关闭服务通道(正常)。

      根据我的经验,通过 GetCallbackChannel 获取的回调通道不应该关闭(请参阅我的这个相关问题:Do I need to Close and/or Dispose callback channels acquired through OperationContext.Current.GetCallbackChannel?

      关闭频道时,您应该使用首选模式:

      Try
          channel.Close()
      Catch ex As Exception
          channel.Abort()
      End Try
      

      因为客户端(通常)在尝试关闭通道时无法知道是否有任何消息仍在进行中,这将导致异常。

      【讨论】:

      • 感谢您的信息,我现在正在关闭客户端的频道,一切都很好。但是,我在关闭之前检查状态,例如如果出现故障则直接调用 Abort()。但是您的结束代码也应该可以正常工作。
      猜你喜欢
      • 2010-12-17
      • 2011-08-24
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多