4

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

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

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

谢谢。

4

6 回答 6

3

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

于 2009-01-20T18:41:38.683 回答
2

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

于 2008-10-22T02:44:50.080 回答
2

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

于 2009-12-19T21:31:48.337 回答
0

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

于 2008-10-22T03:10:30.497 回答
0

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

但我理解你的情况。如果您找到了除登录 ProvideFault 之外的解决方案,请分享。

于 2009-06-19T03:42:06.767 回答
0

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

于 2009-06-22T12:21:31.973 回答