调用WCF回调方法时的正确异常处理
问题描述:
我有一系列的WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WcfDuplexChannels)。但是,似乎有一些可能会发生的异常,所以现在我在每一行回调客户端都有一个巨大的try/catch块,最后在发生任何异常时禁用该事件。除了繁琐的写每一次,我不确定是否可以通过捕获几个基本例外来简化try catch块?现在我并不在意是什么导致异常(我不在乎它是故障,中止,处理还是超时),但是我记录了不同的异常。调用WCF回调方法时的正确异常处理
我也读过关于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;
线将解除绑定事件处理程序的照顾。
答
您可以编写一个包含Funcs Actions作为参数的包装方法,并且您可以在此函数中使用try catch块。你可以使用这个函数调用你的函数;是这样的:
public void CallMethod(Action methodToBeCalled)
{
try
{
methodToBeCalled();
}
catch
.....
....
}
然后打电话给你的功能,如:
CallMethod(() => client.OnProductChanged(products));
这已经跨越了我的脑海里。我特别感兴趣的是,如果有人会对我的问题的IErrorHandler部分做出反应,否则我认为您的答案可能会达到最佳效果。谢谢! – mycroes 2012-03-28 11:57:25
多年后,我回头看这个问题,这正是我现在这样做的方式。捕获已经发生了一些变化,我的服务已经更改为单实例,所以如果发生某些异常类型,客户端将从客户端列表中删除。 – mycroes 2017-09-15 12:10:10