C# 服务边界处的WCF错误日志记录

C# 服务边界处的WCF错误日志记录,c#,wcf,exception,error-handling,C#,Wcf,Exception,Error Handling,我试图在我的WCF服务中实现一个IErrorHandler,以便在传递给客户端之前记录每个到达服务边界的异常。我已经使用IErrorHandler将异常转换为类型化的FaultException,这非常有用。根据IErrorHandler.HandleError()的MSDN,它还用于边界处的日志记录 问题是,HandleError函数不能保证在操作线程上被调用,因此我不知道如何获取有关触发异常的操作的信息。我可以从异常本身中获取TargetSite,但这给了我内部方法,而不是操作。我还可以解析

我试图在我的WCF服务中实现一个IErrorHandler,以便在传递给客户端之前记录每个到达服务边界的异常。我已经使用IErrorHandler将异常转换为类型化的FaultException,这非常有用。根据IErrorHandler.HandleError()的MSDN,它还用于边界处的日志记录

问题是,HandleError函数不能保证在操作线程上被调用,因此我不知道如何获取有关触发异常的操作的信息。我可以从异常本身中获取TargetSite,但这给了我内部方法,而不是操作。我还可以解析StackTrace字符串以找出它被抛出的位置,但这似乎有点脆弱和笨拙。在HandleError函数中,是否有任何一致的、受支持的方式来获取任何状态信息(消息、操作说明等)?或者通过其他方式自动记录服务调用的异常

我正在寻找一个解决方案,使用我现有的日志框架在生产环境中实现,所以SvcTraceViewer不会为我做这件事


谢谢。

我使用iErrorHandler的方式与您描述的相同,但不用于日志记录。相反,在服务类(WCF或非WCF)上,我使用了一个拦截器,如前所述。我相信这项技术将捕获您感兴趣的信息。

您使用了吗?

我最终将日志记录放在了IErrorHandler.providDefault()而不是IErrorHandler.handleerror()。ProviderDefault调用是在操作线程中进行的,因此我可以使用OperationContext.Current来获取一些要记录的信息。

正在传入调用线程上调用ProviderDefault()操作,客户端仍被阻止等待响应。我认为在这个方法中添加一个冗长的过程(比如日志记录)不是一个好主意。这就是为什么他们公开了另一个操作HandleError,它在一个单独的工作线程上被调用


但我理解你的处境。如果您在Provideault内找到了除登录之外的解决方案,请与他人分享。

如何创建实例并保存该实例上的请求消息?

您可以在操作线程上调用的Provideault方法中,将登录异常数据字典所需的任何上下文信息隐藏起来……然后引用它在HandleError方法中用于日志记录。

AOP总是让我抓狂,但在这里看起来非常适用。谢谢分享。