FaultException vs Exception in WCF

本文关键字:WCF in Exception vs FaultException | 更新日期: 2023-09-27 18:27:40

我正在了解WCF服务上下文中的FaultException和CLR Exception,但有些内容尚不清楚。在《学习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);
}

但该会员仍在Opened上,我可以永远呼叫该服务。。。。

这里什么是正确的?当服务抛出CLR异常时,客户端是否应进入故障状态,而当服务抛出FaultException时,客户端应保持打开状态?还是它总是开着?

FaultException vs Exception in WCF

我找不到官方确认,但在我看来是这样的:

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

当发生错误时,会话的状态会变为故障状态,并且由于绑定(如basicHttpBinding)根本不支持会话,因此您无法明显看出连接处于故障状态。尝试使用支持会话的绑定,如netTcpBinding,您应该会发现在抛出异常后,会话是不可访问的。