我正在学习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时,客户端是否应该进入故障状态?还是一直保持开放?
答案 0 :(得分:2)
我找不到官方确认,但我认为这是正在发生的事情:
您使用的BasicHttpBinding
不会保持连接打开,但会在每个请求中创建新的连接。如果切换到NetTcpBinding
,您将看到预期的行为(仅在本地测试)
答案 1 :(得分:1)
当发生错误时,会话的状态进入故障状态,并且由于basicHttpBinding之类的绑定根本不支持会话,因此您无法看到连接处于故障状态。尝试使用支持会话的绑定,例如netTcpBinding,您应该发现在抛出异常后,该会话无法访问。