我正在WCF服务的上下文中学习有关FaultException和CLR异常,但尚不清楚。
在“学习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时,客户端应保持在打开状态吗?还是始终保持开放?
最佳答案
我找不到官方确认书,但这是我的看法:
您使用的BasicHttpBinding
不会保持连接打开,而是在每个请求上创建一个新连接。如果切换到NetTcpBinding
,您将看到预期的行为(仅在本地测试)