关闭回拨/双工通信通道时遇到问题/疑问.以下是我的原型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)
检索回调指针,然后可以使用该指针与客户端进行通信.
我现在的问题是:
我试图关闭服务器端的回调接口,当时服务器知道它不会再进行回调.然而,在回调接口上使用ICommunicationObject :: Close会导致一分钟的阻塞操作.
在我看来,在客户端关闭并不是正确的方法,因为客户端不知道是否有更多的回调需要预期.
谢谢你的帮助.坦率
PS:这似乎是一个非常基本的问题,但到目前为止,我通过谷歌搜索或在stackoverflow中找不到有用的信息......
客户端应关闭服务通道(正常).
通过GetCallbackChannel获取的回调通道不应该根据我的经验关闭(参见我的相关问题:我是否需要关闭和/或处理通过OperationContext.Current.GetCallbackChannel获取的回调通道?)
关闭频道时,您应该使用首选模式:
Try
channel.Close()
Catch ex As Exception
channel.Abort()
End Try
Run Code Online (Sandbox Code Playgroud)
因为客户端(通常)在尝试关闭通道时无法知道是否仍在进行任何消息,这将导致异常.
DuplexChannel 在底层使用 TCP 连接,这就是它模拟双向通信的方式。然而,客户端总是打开该连接,因此它也负责关闭它(想想 TCP 套接字)。因此,您应该使用客户端接口IMyInterface(派生自IClientChannel)来关闭它。
问候巴勃罗。
| 归档时间: |
|
| 查看次数: |
5158 次 |
| 最近记录: |