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

本文关键字:异常处理 WCF 回调 方法 调用 | 更新日期: 2023-09-27 18:29:11

我有一系列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;行将负责解除事件处理程序的绑定。

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

您可以编写一个包装器方法,该方法以函数的Actions为参数,并且可以在该函数中使用try-catch块。您可以使用此函数调用您的函数;类似于:

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

然后调用您的函数,如:

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