服务边界的WCF错误记录

时间:2008-10-21 18:39:03

标签: c# wcf exception error-handling

我正在尝试在我的WCF服务中实现IErrorHandler,以便记录在传递到客户端之前遇到服务边界的每个异常。我已经使用IErrorHandlers将Exceptions转换为类型化的FaultExceptions,这非常有用。根据IErrorHandler.HandleError()的MSDN,它也可用于在边界进行日志记录。

问题是,不保证在操作线程上调用HandleError函数,所以我无法弄清楚如何获取有关触发异常的操作的信息。我可以从异常中获取TargetSite,但这给了我内部方法而不是操作。我也可以通过StackTrace字符串解析它以确定它被抛出的位置,但这似乎有点脆弱和笨拙。在HandleError函数中是否有任何一致的,受支持的方式来获取任何状态信息(消息,操作描述,任何东西)?或者自动记录服务调用异常的任何其他方法?

我正在寻找使用我现有的日志记录框架实现生产的解决方案,因此SvcTraceViewer不会为我做这件事。

感谢。

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我以与您描述的方式相同的方式使用IErrorHanlder,但不用于记录。而不是服务类(WCF与否)我使用了here所描述的拦截器。我相信这种技术将捕获您感兴趣的信息。

答案 2 :(得分:2)

您可以存储在操作线程上调用的ProvideFault方法中登录Exception的数据字典所需的任何上下文信息...然后在HandleError方法中引用它以进行日志记录。

答案 3 :(得分:0)

您是否使用过Service Trace Viewer

答案 4 :(得分:0)

正在调用传入调用线程调用ProvideFault()操作,并且仍然阻止客户端等待响应。我不认为在此方法中添加冗长的进程(如日志记录)是个好主意。这就是为什么他们在另一个工作线程上调用另一个操作HandleError。

但我了解你的情况。如果您在ProvideFault中登录以外的其他解决方案,请分享。

答案 5 :(得分:0)

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