【问题标题】:Log4Net & WCF IErrorHandler - ServiceSecurityContext.Current.WindowsIdentity.Name returns NullReferenceExceptionLog4Net 和 WCF IErrorHandler - ServiceSecurityContext.Current.WindowsIdentity.Name 返回 NullReferenceException
【发布时间】:2012-06-06 17:16:54
【问题描述】:

我正在使用 WCF 服务并且我已经实现了 IErrorHandler。在 HandleError 方法中,我想检索调用者的用户名,以便为 Log4Net 设置 ThreadContext 属性(将用户名与SQL Server 中的异常详细信息)

如果我避免尝试检索调用者的用户名,我的代码运行良好。

这是 HandleError 方法中返回 NullReferenceException 的代码行:

string username = ServiceSecurityContext.Current.WindowsIdentity.Name;

好像在IErrorHandlerHandleError方法启动的那一刻,原来的调用者信息已经被处理掉了。

有谁知道如何在 IErrorHandlerHandlerError 方法中检索调用者的用户名?

感谢您的帮助!

【问题讨论】:

  • 我无法理解您是否可以在 HandleError 方法之外获取名称,或者它是否也失败了。另外,您确定调用该服务的系统有关联的 windows 帐户吗?
  • 您好,塞尔吉奥,感谢您的回复。我现在才看到这条消息,我要到星期一才能回来工作。我很确定我能够在 ProvideFault 方法中检索用户名,而不是在 HandleError 方法中。我必须在星期一回复你。

标签: wcf log4net handleerror ierrorhandler


【解决方案1】:

感谢那些响应帮助的人。我的安全似乎配置正确,但我无法在 WCF 服务的 IErrorHandler 接口的 HandleError 方法中检索用户名。但是,我可以在 ProvideFault 方法中检索用户名。因此,我在 ProvideFault 方法期间设置的 ErrorHandler (IErrorHandler) 类中声明了一个类级别变量,然后使用ErrorHandler 方法中的异常。这是一种“解决方法”,而不是我的偏好,但不幸的是,我似乎无法访问 HandleError 方法中的安全上下文。

以下是代码示例:

public class ErrorHandler : IErrorHandler, IServiceBehavior
{
    private string username = null;

    public bool HandleError(Exception error)
    {
        //Log the exception along with the username.
        //...logging call including the username class member string...

        //Return true to indicate we have performed our behaviour.
        return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
            //Retrieve the username.
            username = ServiceSecurityContext.Current.WindowsIdentity.Name;
    }
}

【讨论】:

    【解决方案2】:

    如果您遇到此异常,那么您可能没有正确配置安全性。另请参阅此答案:https://stackoverflow.com/a/2869481/106567

    【讨论】:

      【解决方案3】:

      使用类级别变量似乎有副作用。处理程序的同一实例似乎用于处理的每个错误(待确认)。因此,如果同时出现 2 个错误,我不知道它会如何反应。因此,在 ProvideFault 中,我使用接收到的异常作为参数将用户名传输到 HandleError 方法。异常有一个 «Data» 属性,它是一个字典。我只添加了两个键值对(一个用于 PrimaryIdentity,一个用于 WindowsIdentity)。在 HandleError 中,我检索了作为参数接收的异常的 Data 属性中的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多