代码之家  ›  专栏  ›  技术社区  ›  Thomas

使用Elmah为WCF Webservices记录用户名

  •  5
  • Thomas  · 技术社区  · 14 年前

    我们使用的方法是 here 用Elmah记录我们的webservice错误。这确实有效,但不幸的是,登录的用户名是空的。

    我们做了一些调试,发现当在ErrorHandler中记录错误时 HttpContext.Current.User 具有正确的用户集。

    我们还尝试:

    HttpContext context = HttpContext.Current;
    ErrorLog.GetDefault(context).Log(new Error(pError, context));
    

    ErrorLog.GetDefault(null).Log(new Error(pError));
    

    关于如何让Elmah记录用户名有什么想法吗?

    另一方面,当直接在Webservice中记录错误时,用户名将按预期记录。但采取这种方法并不十分枯燥。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Shay Erlichmen    14 年前

    Elmah从 Thread.CurrentPrincipal.Identity.Name HttpContext.Current.User .

        2
  •  2
  •   ThomasArdal    8 年前

    这个问题我看了一遍又一遍。虽然重新编译代码是可能的,但我还是建议使用ELMAH中内置的特性,如我在博客中所述 Enrich ELMAH errors using error filtering hook .

    在你的情况下,设置 User ErrorLog_Filtering -方法:

    void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args)
    {
        var httpContext = args.Context as HttpContext;
        if (httpContext != null)
        {
            var error = new Error(args.Exception, httpContext);
            error.User = httpContext.User.Identity.Name;
            ErrorLog.GetDefault(httpContext).Log(error);
            args.Dismiss();
        }
    }
    
        3
  •  0
  •   jdimko    6 年前

    public static void LogError(Exception exception, string username)
    {
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(username), new string[] {});
        Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
    }