【问题标题】:Proper exception handling when invoking WCF callback method调用 WCF 回调方法时的正确异常处理
【发布时间】:2012-03-28 11:38:53
【问题描述】:

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

【问题讨论】:

    标签: c# wcf exception-handling


    【解决方案1】:

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

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

    然后像这样调用你的函数:

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

    【讨论】:

    • 我已经想到了这个。如果有人会对我的问题的 IErrorHandler 部分做出反应,我特别感兴趣,否则我认为您的答案可能已经很好了。谢谢!
    • 多年后我回顾这个问题,这正是我现在正在做的事情。捕获发生了一些变化,我的服务已更改为单个实例,因此如果发生某些异常类型,客户端将从客户端列表中删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多