我正在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,您将看到预期的行为(仅在本地测试)

10-08 14:25