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

Fra*_*nkE 7 wcf

关闭回拨/双工通信通道时遇到问题/疑问.以下是我的原型WCF接口:

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

public interface IMyInterfaceCallback
{
    [OperationContract(IsOneWay = true)]
    void WorkFeedback();
}
Run Code Online (Sandbox Code Playgroud)

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

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea);
IMyInterface myInterface = dcf.CreateChannel();
Run Code Online (Sandbox Code Playgroud)

然后我在服务器端使用

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>();
Run Code Online (Sandbox Code Playgroud)

检索回调指针,然后可以使用该指针与客户端进行通信.

我现在的问题是:

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

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

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

谢谢你的帮助.坦率

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

Pel*_*dao 6

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

通过GetCallbackChannel获取的回调通道不应该根据我的经验关闭(参见我的相关问题:我是否需要关闭和/或处理通过OperationContext.Current.GetCallbackChannel获取的回调通道?)

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

Try
    channel.Close()
Catch ex As Exception
    channel.Abort()
End Try
Run Code Online (Sandbox Code Playgroud)

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


Pab*_*aro 4

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

问候巴勃罗。