2010-10-12 14 views
5

我們正在使用描述here的方法來記錄我們使用Elmah的Web服務錯誤。這實際上有效,但遺憾的是用戶名beeing記錄是空的。使用Elmah登錄WCF Webservices的用戶名

我們做了一些調試,發現在ErrorHandler中記錄錯誤時HttpContext.Current.User有正確的用戶設置。

我們也嘗試:

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

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

沒有成功。

關於如何讓Elmah登錄用戶名的任何想法?

在旁註上,當直接在Web服務中記錄錯誤時,會按預期記錄用戶名。但採取這種方法不是非常乾燥。

回答

4

Elmah從Thread.CurrentPrincipal.Identity.Name獲取用戶,而不是從HttpContext.Current.User獲取用戶。

由於不存在向Elmah添加自定義數據的便捷方法,因此我建議重新編譯代碼並調用HttpContext.Current.User。

+0

我說得對,設置了校長有:'= Thread.CurrentPrincipal中新的GenericPrincipal(新由於ThreadPooling,GenericIdentity(「lala」),新字符串[0])'是一個壞主意? – Thomas 2010-10-12 07:56:39

+0

是的,你不想混亂的線程負責人 – 2010-10-12 07:59:12

+0

如果我在用elmah記錄錯誤後將它重新設置回舊的Principal, – Thomas 2010-10-12 08:00:52

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(); 
    } 
}