处理WCF超时的最佳方法

Jon*_*nes 8 .net c# wcf web-services

我有一个实时应用程序,可跟踪全国多个站点的资产.作为此解决方案的一部分,我有8个客户端应用程序来更新中央服务器.

我的问题是,有时应用程序失去了与中央服务器的连接,我想知道处理这个问题的最佳方法是什么?我知道我可以增加最大发送/接收时间来处理超时但是我还想要一个优雅的解决方案来处理与服务器的连接是否关闭:

例如,我正在调用我的服务:

using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
    statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我想添加一个try/catch所以......

using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
    try
    {
       statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
    }
    catch (TimeoutException timeout)
    {
       LogMessage(timeout);
    }
    catch (CommunicationException comm)
    {
       LogMessage(comm);
    }
}
Run Code Online (Sandbox Code Playgroud)

以这种方式处理它不允许我重新运行代码而不需要重复代码.有人有任何建议吗?

编辑:调查Sixto Saez和user24601答案有一个整体解决方案比处理个别异常级别的超时更好但是...我想以下将解决我的问题(但它会添加一个额外的代码TON错误处理):

void Method(int statusId)
{
     var statusRepository = new StatusRepositoryClient.StatusRepositoryClient()

      try
      {
         IsServerUp();
         statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
         statusRepository.Close(); 
      }            
      catch (Exception ex)
      {
            statusRepository.Abort();

            if (ex is TimeoutException || ex is CommunicationException)
            {
              LogMessage(timeout);
              Method(statusId);
            }
            else
            {
                throw new Exception(ex.Message + ex.InnerException);
            }
        }

  }
}

bool IsServerUp()
{
    var x = new Ping();
    var reply = x.Send(IPAddress.Parse("127.0.0.1"));

    if (reply == null)
    {
       IsServerUp();
    }
    else
    {
       if (reply.Status != IPStatus.Success)
       {
          IsServerUp();
       }
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

nul*_*ter 3

对于初学者,我认为您的 Wcf 错误处理是错误的。它应该看起来像这样

var statusRepository = new StatusRepositoryClient.StatusRepositoryClient();
try
{
    statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
    statusRepository.Close()
}
catch(Exception e)
{
   statusRepository.Abort();
   LogMessage(e);
   throw; //I would do this to let user know.
}
Run Code Online (Sandbox Code Playgroud)

我还会重新抛出错误,让用户知道问题所在。