【发布时间】:2011-05-26 21:10:41
【问题描述】:
Silverlight 应用程序和 WCF Web 服务之间的双工 Net.TCP 连接会定期进入故障状态——例如,由于暂时的网络问题,或者服务崩溃并重新启动,诸如此类。发生这种情况时,我想抓住它,然后重新打开连接。听起来很简单,对吧?您应该能够执行以下操作:
private void Channel_Faulted(object sender, EventArgs e)
{
client.CloseCompleted += (sender, e) =>
{
if (e.Error == null)
client = CreateClient();
else
Debug.WriteLine(e.Error.ToString());
};
client.CloseAsync();
}
但是当我尝试 CloseCompleted 处理程序中的 e.Error 有这个异常时:
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为它处于故障状态。
我在同一主题上尝试了一大堆变体,包括:
- 出现故障后不关闭连接,只是重新创建它。
- 手动调用 client.InnerChannel.Close() 和/或 client.ChannelFactory.Close()。
- 手动调用 client.InnerChannel.Dispose() 和/或 client.ChannelFactory.Dispose()。
- 我现在忘记了很多其他东西。
这些策略导致了各种错误,但没有一个能正常工作,包括提到的那种非 Silverlight 解决方案,例如 here 或 here(但都是针对常规 CLR 应用程序,而不是 Silverlight) .当然,这是一件相当简单的事情,但显然频道缓存妨碍了我。我错过了什么?在 Silverlight 中执行此操作的正确方法是什么?如果这是 Silverlight 中的错误,那么正确的解决方法是什么?
【问题讨论】:
标签: silverlight wcf