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

Posted

技术标签:

【中文标题】服务边界处的 WCF 错误日志记录【英文标题】:WCF Error Logging at Service Boundary 【发布时间】:2010-09-18 09:19:25 【问题描述】:

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

AOP 总是让我感到害怕,但在这里看起来非常适用。谢谢分享。【参考方案3】:

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

【讨论】:

【参考方案4】:

你用过Service Trace Viewer吗?

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于服务边界处的 WCF 错误日志记录的主要内容,如果未能解决你的问题,请参考以下文章

我有一个供应商试图与我的 WCF api 通信,他们收到 http:500 错误,但 IIS 日志记录未显示详细信息

WCF 最大消息大小配额

WCF 客户端日志记录 dotnet 核心

EndpointDispatcher 错误处的 WCF ContractFilter 不匹配

2 台相同服务器上的 PHP 错误:一个记录到 php 错误日志,另一个记录 apache 错误日志

WCF中记录SOAP消息日志