2

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

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

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

string username = ServiceSecurityContext.Current.WindowsIdentity.Name;

似乎在IErrorHandler的HandleError方法启动时,原来的调用者信息已经被处理掉了。

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

谢谢你的帮助!

4

3 回答 3

3

感谢那些响应帮助的人。我的安全似乎配置正确,但我无法在 WCF 服务的 IErrorHandler 接口的 HandleError方法中检索用户名。但是,我可以在ProvideFault方法中检索用户名。因此,我在ErrorHandler ( IErrorHandler ) 类中声明了一个类级别变量,该变量在ProvideFault方法期间设置,然后在 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;
    }
}
于 2012-06-13T21:34:12.383 回答
0

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

于 2012-06-09T11:23:09.930 回答
0

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

于 2015-05-08T18:37:21.217 回答