关闭回拨/双工通信渠道时遇到问题/疑问。 以下是我的原型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>();
检索回调指针,然后可以使用该指针与客户端进行通信。
我现在的问题是:
我尝试关闭服务器端的回调接口,当时服务器知道它不会再进行回调。 然而,在回调接口上使用ICommunicationObject :: Close会导致一分钟的阻塞操作。
在我看来,在客户端关闭并不是正确的方法,因为客户端不知道是否还有更多的回调需要。
感谢您的帮助。 弗兰克
P.S .: 这似乎是一个非常基本的问题,但到目前为止,我在通过谷歌搜索或在stackoverflow中搜索时没有找到有用的信息......
答案 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)来关闭它。
此致 巴勃罗。