使用 HandleError 或 ProvideFault 中的 IErrorHandler 在 WCF 中记录异常?

Posted

技术标签:

【中文标题】使用 HandleError 或 ProvideFault 中的 IErrorHandler 在 WCF 中记录异常?【英文标题】:Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault? 【发布时间】:2011-02-21 14:28:51 【问题描述】:

我正在使用 IErrorHandler 在 WCF 中进行异常处理,现在我想记录异常以及堆栈跟踪和导致异常的用户。

我能看到获取导致异常的用户的唯一方法是:

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

...但这似乎只在 ProvideFault 中有效,在 HandleError 中无效。有没有办法让用户进入 HandleError?我想使用 HandleError 而不是 ProvideFault,因为它在后台线程上调用并用于错误记录,对吗?

【问题讨论】:

【参考方案1】:

IErrorHandler 的两个方法具有相当明确的职责:

HandleError 在这里处理所有未捕获的异常 - 这就是为什么它是进行日志记录的最佳位置 - 这确实是它的全部原因

ProvideFault 的任务是将您的 .NET 异常转换为可互操作的 SOAP 错误 - 或完全忽略该异常

当然,技术上没有什么可以阻止您使用ProvideFault 方法进行日志记录——如果我不得不寻找该功能,我不会去那里寻找它。我倾向于遵循最不意外的原则——如果方法被称为ProvideFault,我只希望它提供一个FaultException<T>——也不要做很多其他事情。

要访问您的服务的安全上下文,请使用以下 sn-p 代码:

ServiceSecurityContext secCtx = ServiceSecurityContext.Current;

if(secCtx.PrimaryIdentity != null)

   // do something with primary identity

【讨论】:

我同意,但是如何从 HandleError 方法中获取用户信息(ServiceSecurityContext.PrimaryIdentity)? 在我的环境中访问 HandleError() 中的 ServiceSecurityContext.Current 会抛出带有“消息已关闭”文本的 ObjectDisposedException。 @marc_s,你真的试过了吗?虽然 ProvideFault() 方法似乎在存在操作(和安全)上下文时运行,但 HandleError() 方法在上下文被拆除后运行。 嗨@mar​​c_s,你能检查我的问题吗,***.com/questions/31508724/…

以上是关于使用 HandleError 或 ProvideFault 中的 IErrorHandler 在 WCF 中记录异常?的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 HandleError 不显示错误页面

HandleError Attribute

WCF HandleError System.InvalidOperationException 一个任务只有在它处于完成状态时才能被释放

工作流服务中 HandleError 与 ProvideFault 不一致,如何处理?

如何使用HandleError仅处理特定类型的Exception,并正常抛出其余的Exceptions?

MVC HandleError 属性在控制器上不起作用