我正在使用IErrorHandler在WCF中进行异常处理,现在我想记录异常,以及堆栈跟踪和导致异常的用户。
我能看到导致异常的用户的唯一方法是:
OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity
...但这似乎只在ProvideFault内部工作,而不是在HandleError内部。有没有办法让用户进入HandleError?我想使用HandleError而不是ProvideFault,因为它在后台线程上被调用并且用于错误记录,对吧?
答案 0 :(得分:3)
IErrorHandler的两个方法具有相当明确的职责:
HandleError 用于处理所有未捕获的异常 - 这就是为什么它是进行日志记录的最佳位置 - 这真的是它的全部理由
ProvideFault 的任务是将您的.NET异常转换为可互操作的SOAP错误 - 或者完全忽略异常
当然,从技术上讲,没有什么可以阻止你在ProvideFault
方法中进行日志记录 - 如果我不得不寻找它,那就不是我会寻找该功能的地方。我倾向于遵循最小惊喜的原则 - 如果该方法被称为ProvideFault
,我只希望它提供FaultException<T>
- 也不会做很多其他事情。
要访问服务的安全上下文,请使用以下代码段:
ServiceSecurityContext secCtx = ServiceSecurityContext.Current;
if(secCtx.PrimaryIdentity != null)
{
// do something with primary identity
}