WCF回调接口 - 谁关闭了频道

时间:2011-12-13 16:19:46

标签: wcf

关闭回拨/双工通信渠道时遇到问题/疑问。 以下是我的原型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)或两者。
  3. 我尝试关闭服务器端的回调接口,当时服务器知道它不会再进行回调。 然而,在回调接口上使用ICommunicationObject :: Close会导致一分钟的阻塞操作。

    在我看来,在客户端关闭并不是正确的方法,因为客户端不知道是否还有更多的回调需要。

    感谢您的帮助。 弗兰克

    P.S .: 这似乎是一个非常基本的问题,但到目前为止,我在通过谷歌搜索或在stackoverflow中搜索时没有找到有用的信息......

2 个答案:

答案 0 :(得分:6)

客户端应关闭服务通道(正常情况下)。

根据我的经验,不应该关闭通过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

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

答案 1 :(得分:3)

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

此致 巴勃罗。