我们正在使用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中记录错误时,将按预期记录用户名。但采取这种方法并不是很干。
答案 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);
}