WCF回调接口 - 谁关闭通道

7

我遇到了关闭回调/双工通信通道的问题/疑问。以下是我的典型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关闭回调接口却导致一分钟阻塞操作。

在客户端关闭的做法,我认为是不正确的,因为客户端不知道是否有更多的回调要接收。

谢谢任何帮助。 Frank

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

2个回答

7
客户端应该正常关闭服务通道。
在我的经验中,通过“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()。但是你的关闭代码也应该可以正常工作。 - FrankE

4

DuplexChannel使用TCP连接来模拟双向通信。然而,客户端始终打开该连接,因此也负责关闭它(类似于TCP套接字)。因此,您应该使用客户端接口IMyInterface(它派生自IClientChannel)来关闭连接。

祝好 Pablo。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接