【发布时间】:2014-11-05 16:19:22
【问题描述】:
我正在使用 WCF IErrorHandler 接口在 WCF 服务的服务器端捕获和记录错误。但是,传递给 HandleError 和 ProvideFault 的异常的 StackTrace 却搞砸了:
在 System.ServiceModel.Dispatcher.TaskMethodInvoker.InvokeEnd(对象 实例,Object[]& 输出,IAsyncResult 结果)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeEnd(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage7(MessageRpc& RPC) ....更多
我对在堆栈跟踪中看到随机的 Dispatcher 方法并不感到惊讶,但我认为我会在堆栈顶部看到我自己的方法。
我已经确定这只发生在看起来像这样的操作上
[OperationContract]
public Task<int> MyOperation()
{
throw new ApplicationException("test");
}
看起来像这样的服务有一个适当的堆栈跟踪供我记录:
[OperationContract]
public int MySyncOperation()
{
throw new ApplicationException("test");
}
作为一个仅供参考,以下是错误处理程序的方法:
public class MyErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
//variable 'error' has wrong stack trace if exception sourced from Task<int> operation
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
//variable 'error' has wrong stack trace if exception sourced from Task<int> operation
}
}
请注意,异常类型和消息是正确的,所以就好像他们用“throw ex”而不是“throw”错误地在某处重新抛出我的异常;
有什么方法可以从 IErrorHandler 方法之一获取正确的异常堆栈跟踪?
【问题讨论】:
-
您找到解决方案了吗?
-
不幸的是没有。这不是世界末日,因为保留了异常类型和消息,我希望应用程序中发生的单独日志记录将帮助我对错误发生的位置进行三角测量。还没有上线,所以我不清楚这在实践中会有多有效
-
此外,我的应用永远不会有任何错误,所以这是一个没有实际意义的问题 ;-)