使用Elmah为WCF Web服务记录用户名

时间:2010-10-12 07:17:54

标签: asp.net wcf exception logging elmah

我们正在使用here描述的方法来记录我们与Elmah的Web服务错误。这实际上是有效的,但遗憾的是,记录的用户名是空的。

我们做了一些调试,发现当在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 个答案:

答案 0 :(得分:4)

Elmah从Thread.CurrentPrincipal.Identity.Name开始,而非HttpContext.Current.User

由于没有方便的方法向Elmah添加自定义数据,我建议重新编译代码,然后调用HttpContext.Current.User。

答案 1 :(得分:2)

这是我一遍又一遍地看到的问题。虽然重新编译代码是可能的,但我建议使用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();
    }
}

答案 2 :(得分:0)

作为重新编译Elmah的替代方法,我们可以使用全局方法,该方法在调用elmah之前填充Thread.CurrentPrincipal.Identity.Name。

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