【问题标题】:Closing and reopening a faulted DuplexClientBase WCF proxy in Silverlight在 Silverlight 中关闭和重新打开有故障的 DuplexClientBase WCF 代理
【发布时间】: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 解决方案,例如 herehere(但都是针对常规 CLR 应用程序,而不是 Silverlight) .当然,这是一件相当简单的事情,但显然频道缓存妨碍了我。我错过了什么?在 Silverlight 中执行此操作的正确方法是什么?如果这是 Silverlight 中的错误,那么正确的解决方法是什么?

【问题讨论】:

    标签: silverlight wcf


    【解决方案1】:

    与大多数似乎以莫名其妙的方式工作的事情一样,问题是我的错。我正在使用的实际代码(我希望这并不奇怪)比我上面发布的简化版本要复杂得多。事实证明,在我的真实代码中,在我正在测试的特定代码路径中,从未调用过与此行等效的代码:

    client = CreateClient();
    

    换句话说,客户端在抛出错误后实际上并没有被重新创建,而我遇到的错误主要是由于尝试重用旧实例造成的。抱歉打扰了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 2011-04-07
      • 1970-01-01
      • 2011-07-30
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多