【问题标题】:Can a WCF client become faulted without a triggering event?WCF 客户端可以在没有触发事件的情况下出现故障吗?
【发布时间】:2012-05-12 01:26:51
【问题描述】:

如elsewhere 所述,此代码可能会出现竞争条件:

    // do stuff with client, catch exceptions
    if (client.State == CommunicationState.Faulted)
    {
        client.Abort();
    }
    else
    {
        // I hope nothing happened since I checked for a faulted state
        client.Close();
    }

...还是这样?

作为状态机,在什么情况下客户端会在尝试检查其状态并随后关闭它之间进入故障状态?即使在几分钟/几小时/几天之后。

我尝试了以下简单的测试,以排除丢失与服务器的连接:

  • 在 if 语句处设置断点。我看到 client.State == 打开了。继续前进。
  • 终止 WCF 服务器进程。继续前进。
  • Client.Close() 执行没有问题。

作为第二个测试,我没有杀死服务器进程,而是等待ReceiveTimeout 过去。然后我又等了一分钟。然后我踩到 Client.Close()。没问题。

客户端可以在没有我任何输入的情况下进入故障状态吗?如果不能,是否真的有可能出现竞争条件?


编辑:也许这太笼统了,但我正在寻找一般指导。我问这个问题的原因是因为我需要让一些 Web 开发人员使用 WCF 而不是过时的 Web 服务技术。理想情况下,我希望能够告诉他们他们不能使用using,但他们可以使用try-catch-finally,只要最终检查错误状态并中止而不是关闭(我认为这种方法易于理解和采用 - 很重要,因为当您开始 WCF 时已经有很多东西要学习)。

然后我开始考虑竞争条件问题并且想不出一个可能发生的例子,因为其意图是关闭客户端,如果它是你不会这样做的正在其他地方使用(即在当前程序中的程序或线程之间共享。)

所以,问题仍然存在,在这种情况下是否有可能出现竞争条件,谁能给我一些演示它的代码?

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    您链接的帖子正在讨论针对 wxf 代理客户端的 using 语句问题的相当通用的解决方案。因此,在一般情况下,我可以想象在很多情况下您粘贴的代码会发生竞争。尤其是共享同一个客户端的多线程情况。

    【讨论】:

    • 不会在更大的范围内定义共享客户端。不在 using 块/using-block-alternative 内?
    【解决方案2】:

    没有令人满意的答案,所以the MSDN solution 将不得不这样做:

    try
    {
        ...
        client.Close();
    }
    catch (CommunicationException e)
    {
        ...
        client.Abort();
    }
    catch (TimeoutException e)
    {
        ...
        client.Abort();
    }
    catch (Exception e)
    {
        ...
        client.Abort();
        throw;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多