2010-10-12 7 views
5

Korzystamy z podejścia opisanego jako here, aby rejestrować błędy naszych usług internetowych w Elmah. A to faktycznie działa, ale niestety nazwa użytkownika jest pusta.Logowanie użytkownika z Elmah dla WCF Webservices

Zrobiliśmy kilka debugowania i stwierdziliśmy, że podczas rejestrowania błędu w ErrorHandler HttpContext.Current.User ma prawidłowy zestaw użytkownika.

Próbowaliśmy także:

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

i

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

bez powodzenia.

Jakieś pomysły, w jaki sposób możemy zrobić Elmah zalogować nazwę użytkownika?

W zdaniu, podczas rejestrowania błędu bezpośrednio w usłudze internetowej, nazwa użytkownika jest rejestrowana zgodnie z oczekiwaniami. Ale przyjęcie tego podejścia nie jest bardzo suche.

Odpowiedz

4

Elmah odbiera użytkownika od Thread.CurrentPrincipal.Identity.Name, a nie od HttpContext.Current.User.

Ponieważ nie istnieje wygodny sposób dodawania niestandardowych danych do Elmah, sugerowałbym ponowną kompilację kodu i wywoływanie HttpContext.Current.User zamiast tego.

+0

mam rację, że ustawienie Pricipal z: 'Thread.CurrentPrincipal = new GenericPrincipal (nowa GenericIdentity ("lala"), nowy ciąg [0]) "jest złym pomysłem z powodu ThreadPooling? – Thomas

+0

Tak, nie chcesz zadzwonić z głównym wątkiem –

+0

A jeśli ustawię go z powrotem do starego Principal po zalogowaniu błędu z elmah? – Thomas

2

To pytanie, które widzę w kółko. Mimo że możliwe jest ponowne skompilowanie kodu, proponuję użyć już wbudowanych funkcji w ELMAH, jak wyjaśniono w moim blogu: Enrich ELMAH errors using error filtering hook.

W twoim przypadku, ustawienie właściwości User na wszystkich błędów, można osiągnąć poprzez dodanie ErrorLog_Filtering metoda:

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