调用WCF回调方法时的正确异常处理

时间:2012-03-28 11:38:53

标签: c# wcf exception-handling

我有一系列WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WcfDuplexChannels)。但是,似乎有一些异常可能发生,所以现在我有一个巨大的try / catch块围绕每一行回调客户端,最后在发生任何异常时禁用该事件。除了每次写入都很麻烦之外,我不确定是否可以通过捕获几个基本异常来简化try catch块?现在我并不关心导致异常的原因(我不关心它是否出现故障,中止,处置或超时)但我记录了不同的例外情况。

我也读过有关IErrorHandler的内容,但在客户端调用方法时,这实际上是否合适?

以下是我目前战略的一个示例:

    private void OnProductChanged(List<DTO> products)
    {
        try
        {
            client.OnProductChanged(products);
            return;
        }
        catch (TimeoutException)
        {
            log.Info("Communication to client timed out.");
        }
        catch (CommunicationObjectAbortedException)
        {
            log.Info("Connection to client is in aborted state.");
        }
        catch (CommunicationObjectFaultedException)
        {
            log.Info("Connection to client is in faulted state.");
        }
        catch (CommunicationException ce)
        {
            log.InfoFormat("CommunicationException occured on product change notification: {0}.", ce.Message);
        }
        catch (ObjectDisposedException)
        {
            log.Info("Communication channel is disposed.");
        }
        catch (Exception e)
        {
            log.WarnFormat("Unhandled {0} on client callback: {1}", e.GetType(), e.Message);
        }

        SendProductChanged = false;
    }

SendProductChanged = false;行将负责解除事件处理程序的绑定。

1 个答案:

答案 0 :(得分:1)

您可以编写一个包装器方法,将Funcs的动作作为参数,您可以在此函数中使用try catch块。您可以使用此功能调用您的函数;类似的东西:

public void CallMethod(Action methodToBeCalled)
{
   try
   {
      methodToBeCalled();
   }
   catch 
   .....
   ....
}

然后调用您的函数:

CallMethod(() => client.OnProductChanged(products));