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

Dan*_*rbo 6 error-handling service wcf exception

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

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

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

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

mar*_*c_s 3

IErrorHandler 的两个方法具有明确定义的职责:

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

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

当然,从技术上讲,没有什么可以阻止您在该ProvideFault方法中进行日志记录 - 如果我必须寻找该功能,这不是我会去寻找该功能的地方。我倾向于遵循最不意外的原则 - 如果调用该方法ProvideFault,我只期望它提供FaultException<T>- 而不是做很多其他事情。

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

ServiceSecurityContext secCtx = ServiceSecurityContext.Current;

if(secCtx.PrimaryIdentity != null)
{
   // do something with primary identity
}
Run Code Online (Sandbox Code Playgroud)

  • 在我的环境中,访问 HandleError() 中的 ServiceSecurityContext.Current 会抛出带有“消息已关闭”文本的 ObjectDisposeException。 (8认同)