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

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

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

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

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

【问题讨论】:

    标签: wcf exception error-handling service


    【解决方案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,你能检查我的问题吗,stackoverflow.com/questions/31508724/…
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多