这带来了我的问题——我们正在尝试确定处理客户端通道进入故障状态的最佳方法。在进行一些搜索后,我们想到了以下解决方案:
if(client.State = CommuncationState.Faulted)
{
client = new Client();
}
try
{
client.SomeMethod();
}
catch //specific exceptions left out for brevity
{
//logging or whatever we decide to do
throw;
}
然而,由于在我们的情况下,即使服务已经停止,客户端仍会显示“Open
”状态,直到你真正尝试使用它进行调用,此时它才进入“Faulted
”状态,因此此方法无效。
所以这让我们想到其他的解决方案。我们提出了另一种选择:
try
{
client.SomeMethod();
}
catch
{
if(client.State == CommunicationState.Faulted)
{
//we know we're faulted, try it again
client = new Client();
try
{
client.SomeMethod();
}
catch
{
throw;
}
}
//handle other exceptions
}
但这样会有异味。显然,我们可以通过每次调用时使用新客户端并处理掉它来避免这种情况。那似乎是不必要的,但如果这是正确的方法,那么我想这就是我们要选择的方法。那么优雅地处理确定客户端是否处于失效状态,然后采取措施的最佳方法是什么?我们真的应该为每个调用获取一个新的客户端吗?
还有一件事要记住 - 客户端的实例化以及所有这些检查和处理都发生在客户端的包装类中。如果我们按照我们的意图这样做,它对应用程序本身是透明的 - 调用和处理异常不需要任何特殊的代码。