WCF 错误日志记录在服务边界

WCF Error Logging at Service Boundary

提问人:Eric W 提问时间:10/22/2008 最后编辑:Eric W 更新时间:12/20/2009 访问量:2828

问:

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

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

我正在寻找一种解决方案,使用我现有的日志记录框架在生产环境中实现,因此 SvcTraceViewer 不会为我执行此操作。

谢谢。

C# WCF 异常 错误处理

评论


答:

2赞 Tim Scott 10/22/2008 #1

我以与您描述的相同的方式使用 IErrorHanlder,但不用于日志记录。相反,在服务类(WCF 或非 WCF)上,我使用此处所述的侦听器。我相信这种技术会捕捉到你感兴趣的信息。

评论

0赞 smaclell 10/22/2008
AOP 总是让我感到害怕,但在这里看起来非常适用。谢谢你的分享。
0赞 Mark Cidade 10/22/2008 #2

您是否使用过服务跟踪查看器

3赞 Eric W 1/21/2009 #3

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

0赞 user70932 6/19/2009 #4

ProvideFault() 操作正在传入调用线程上调用,并且客户端仍处于阻塞状态,等待响应。我认为在此方法中添加冗长的过程(如日志记录)不是一个好主意。这就是为什么他们公开了另一个操作 HandleError whch 在单独的工作线程上调用的原因。

但我理解你的情况。如果您在 ProvideFault 中找到了日志记录以外的解决方案,请分享。

0赞 user70932 6/22/2009 #5

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

2赞 WayneC 12/20/2009 #6

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