Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用WCF回调方法时正确的异常处理_C#_Wcf_Exception Handling - Fatal编程技术网

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

C# 调用WCF回调方法时正确的异常处理,c#,wcf,exception-handling,C#,Wcf,Exception Handling,我有一系列WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WCFDuplexChannel)。然而,似乎有相当多的异常可能会发生,所以现在我有一个巨大的try/catch块围绕每一行调用回客户端,以在任何异常发生时禁用事件结束。除了每次编写都很麻烦之外,我不确定是否可以通过捕获几个基本异常来简化try-catch块?现在我真的不关心是什么导致了异常(我不关心它是否出错、中止、处理或超时),但我会记录不同的异常 我也读过关于IErrorHandler的内容,但在客户端调用方法时,这是

我有一系列WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WCFDuplexChannel)。然而,似乎有相当多的异常可能会发生,所以现在我有一个巨大的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;
    }
private void OnProductChanged(列出产品)
{
尝试
{
客户。OnProductChanged(产品);
返回;
}
捕获(超时异常)
{
log.Info(“与客户端的通信超时”);
}
捕获(通信对象中止异常)
{
log.Info(“与客户端的连接处于中止状态”);
}
捕获(通信对象故障异常)
{
log.Info(“与客户端的连接处于故障状态”);
}
捕获(通信异常ce)
{
log.InfoFormat(“在产品更改通知上发生通讯异常:{0}.”,ce.Message);
}
捕获(ObjectDisposedException)
{
log.Info(“通信信道被处理”);
}
捕获(例外e)
{
WarnFormat(“客户端回调上未处理的{0}:{1}”,e.GetType(),e.Message);
}
SendProductChanged=false;
}

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

您可以编写一个包装器方法,将Funcs的操作作为参数,并且可以在此函数内使用try-catch块。您可以使用此函数调用您的函数;比如:

public void CallMethod(Action methodToBeCalled)
{
   try
   {
      methodToBeCalled();
   }
   catch 
   .....
   ....
}
然后调用如下函数:

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

我突然想到了这一点。我特别感兴趣的是,如果有人会对我问题的第二部分做出反应,否则我认为你的答案可能是最好的。谢谢几年后,我回顾这个问题,这正是我现在的做法。捕获发生了一些变化,并且我的服务已更改为单实例,因此,如果出现某些异常类型,则会将客户端从客户端列表中删除。