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时,客户端应保持打开状态?还是它总是开着?
我找不到官方确认,但在我看来是这样的:
您使用BasicHttpBinding
,它不会保持连接打开,但会在每次请求时创建新的连接。如果切换到NetTcpBinding
,您将看到预期的行为(刚刚在本地测试)
当发生错误时,会话的状态会变为故障状态,并且由于绑定(如basicHttpBinding)根本不支持会话,因此您无法明显看出连接处于故障状态。尝试使用支持会话的绑定,如netTcpBinding,您应该会发现在抛出异常后,会话是不可访问的。