WCF中的FaultException与Exception

时间:2015-12-22 12:29:41

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

我正在学习WCF服务上下文中的FaultException和CLR Exceptions,但有些事情并不清楚。 在“学习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时,客户端是否应该进入故障状态?还是一直保持开放?

2 个答案:

答案 0 :(得分:2)

我找不到官方确认,但我认为这是正在发生的事情:

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

答案 1 :(得分:1)

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