【问题标题】:FaultException vs Exception in WCFWCF 中的 FaultException 与异常
【发布时间】:2015-12-22 12:29:41
【问题描述】:

我正在了解有关 WCF 服务上下文中的 FaultException 和 CLR 异常,但有些事情尚不清楚。 在“Learning WCF”一书中,它说当服务抛出一个正常的 CLR 异常时,它被服务模型捕获,服务模型从中构造一个 SOAP 消息,将其发送回客户端,然后在客户端抛出异常再次。那里的通道有故障。

所以我构建了一个抛出 NullReferenceException 的服务。 客户端调用服务,捕获异常并打印 CommunicationState。

try
{
    x = Proxy.Call(); // throws NullReferenceException at the service
}
catch (Exception ex) // or CommunicationException is the same
{
    MessageBox.Show("" + Proxy.InnerChannel.State);
}

但是状态成员保持打开状态,我可以永远调用该服务....

这里什么是正确的?当服务抛出 CLR 异常时,客户端是否应该进入故障状态并在服务抛出 FaultException 时保持 Opened 状态?还是一直开着?

【问题讨论】:

    标签: c# .net web-services wcf soap


    【解决方案1】:

    我找不到官方确认,但这是我认为的情况:

    您使用BasicHttpBinding 不会保持连接打开,但会在每个请求上创建一个新连接。如果你切换到NetTcpBinding,你会看到预期的行为(刚刚在本地测试过)

    【讨论】:

    • 我也在使用可靠会话。会不会跟这有关系?
    • 在这里检查了可靠的会话。像以前一样工作,在 netTcpBinding 异常中断连接。不幸的是,如果没有最少的工作样本,很难说出错误在哪里
    【解决方案2】:

    当发生错误时,会话的状态进入故障状态,并且由于 basicHttpBinding 等绑定根本不支持会话,因此您无法清楚地看到连接处于故障状态。尝试使用支持会话的绑定,例如 netTcpBinding,您应该会发现该会话在抛出异常后无法访问。

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 2011-08-08
      • 2013-06-08
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多