我在关闭回调/双工通信通道时遇到问题/疑问。
这是我的原型 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>();
检索回调指针,然后可以使用该指针与客户端进行通信。
我现在的问题是:
- 谁应该关闭沟通渠道?客户端或服务器
- 哪些通信对象需要关闭?原始接口 (IMyInterface) 或回调接口 (IMyInterfaceCallback) 或两者。
我尝试关闭服务器端的回调接口,当服务器知道它不会再进行回调时。
然而,在回调接口上使用 ICommunicationObject::Close 会导致一分钟的阻塞操作。
在我看来,在客户端关闭并不是正确的方法,因为客户端不知道是否会有更多回调。
谢谢你的帮助。
坦率
附:
这似乎是一个非常基本的问题,但到目前为止,我在通过谷歌或 stackoverflow 搜索时没有找到有用的信息......
客户端应关闭服务通道(正常)。
根据我的经验,通过 GetCallbackChannel 获取的回调通道不应关闭(请参阅我的相关问题:我是否需要关闭和/或处置通过OperationContext.Current.GetCallbackChannel 获取的回调通道? https://stackoverflow.com/questions/8165398/do-i-need-to-close-and-or-dispose-callback-channels-acquired-through-operationco)
关闭通道时,您应该使用首选模式:
Try
channel.Close()
Catch ex As Exception
channel.Abort()
End Try
因为客户端(通常)在尝试关闭通道时无法知道是否有任何消息仍在进行中,这会导致异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)