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

时间:2010-05-19 21:08:15

标签: wcf exception error-handling service

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

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

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

...但这似乎只在ProvideFault内部工作,而不是在HandleError内部。有没有办法让用户进入HandleError?我想使用HandleError而不是ProvideFault,因为它在后台线程上被调用并且用于错误记录,对吧?

1 个答案:

答案 0 :(得分:3)

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

  • HandleError 用于处理所有未捕获的异常 - 这就是为什么它是进行日志记录的最佳位置 - 这真的是它的全部理由

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

当然,从技术上讲,没有什么可以阻止你在ProvideFault方法中进行日志记录 - 如果我不得不寻找它,那就不是我会寻找该功能的地方。我倾向于遵循最小惊喜的原则 - 如果该方法被称为ProvideFault,我只希望它提供FaultException<T> - 也不会做很多其他事情。

要访问服务的安全上下文,请使用以下代码段:

ServiceSecurityContext secCtx = ServiceSecurityContext.Current;

if(secCtx.PrimaryIdentity != null)
{
   // do something with primary identity
}