2012-02-26 8 views
6

W środowisku, w którym około 100 użytkowników loguje się do witryny z uwierzytelnianiem formularzy, wywoływanie HttpContext.Current.User.Identity.Name zwraca poprawnie zalogowanego użytkownika .Problem z HttpContext.Current.User.Identity.Name

Jednak w 10% przypadków zwracane są nieprawidłowe informacje o pełnej nazwie użytkownika. Nigdy nie miałem takiego problemu na mojej maszynie wytrzymałościowej, zdarza się to tylko w produkcji. Nie mogę odtworzyć tego samego środowiska z wieloma użytkownikami na moim komputerze testowym.

Logika tej aplikacji:

1) użytkownik wprowadzi nazwę użytkownika i przekazać, informacja jest sprawdzana poprzez SQL DB rozmowy, jeśli mecz, użytkownik jest uwierzytelniony poprzez FormsAuthentication.RedirectFromLoginPage (podając nazwę użytkownika, false)

FormsAuthentication.SetAuthCookie(user.SYS_Users_ID.ToString(), false); 

if (Request["ReturnURL"] == null) 
    FormsAuthentication.RedirectFromLoginPage(user.SYS_Users_ID.ToString(), false); 
else 
    Response.Redirect("/" + SysConfig.ApplicationName + appConfig.DefaultPages.DefaultPage); 

2) Po przekierowaniu umieścić pełną nazwę użytkownika w ukrytym polu

if (!IsPostBack) 
    userFullName.Value = Helper.GetCurrentUserFullName(); 

... 

public static string GetCurrentUserFullName() 
{ 
    string _userFullName = string.Empty; 
    try 
    { 
     _userFullName = new AgrotMasofim.DAL.Users.Users().GetUserFullName(GetCurrentUserID()); 
    } 
    catch (Exception ex) 
    { 
     Logs.WriteToFileLog(string.Empty,ex); 
    } 
    return _userFullName; 
} 



public static Decimal GetCurrentUserID() 
     { 
      Decimal _userID = 0; 

      if (HttpContext.Current.User != null) 
      { 
       try 
       { 
        _userID = Convert.ToDecimal(HttpContext.Current.User.Identity.Name); 
       } 
       catch (Exception ex) 
       { 
        Logs.WriteToFileLog(string.Empty, ex); 
       } 
      } 
      return _userID; 
     } 

3) na wszystkich stronach wizyt użytkowników, jego/h er info jest wyświetlane wewnątrz Etykiety, która znajduje się na stronie wzorcowej. Jest ona wyświetlana na etykiecie, która jest na stronie wzorcowej. Jest to prawie cały czas. Jakieś pomysły, które mogą być przyczyną awarii od od czasu do czasu?

+1

Pokaż nam kod metody "GetCurrentUserFullName()". – tvanfosson

+0

Co masz na myśli przez złe informacje? Czy to imię kogoś innego? Czy jest pusty? – Aliostad

+0

Jak jest określona zmienna userFullName? –

Odpowiedz

1

Brak więcej kodu, mogę tylko zgadywać na twój problem. Ponieważ inne osoby mogą znaleźć twoje pytanie i mieć podobne problemy, domyślam się, że twój problem polega na błędnym użyciu klas statycznych lub właściwości.

Twoja metoda może opierać się na metodzie dostępu do danych, która jest statycznie współdzielona między wszystkimi wątkami. W klasach dostępu do danych może występować warunek wyścigu, który czasami powoduje wyszukanie identyfikatora użytkownika, który jest zastępowany przez inne żądanie przed pobraniem danych. Rozwiązaniem tego problemu jest albo (a) użycie zamków we wszystkich krytycznych sekcjach twojej klasy dostępu do danych lub (b) skorzystanie z rozwiązania, które tworzy nowe klasy dostępu do danych dla każdego żądania (naprawdę każda jednostka pracy). Ten ostatni projekt wymaga, aby twoje klasy dostępu do danych były lekkie, ale byłyby lepsze, ponieważ łatwiej będzie je przetestować.

Jest również możliwe, jeśli buforujesz wartości w statycznych właściwościach lub innych klasach statycznych, które byłyby współdzielone między wątkami, że masz podobny stan wyścigu, gdy te wartości są buforowane i używane. Podobne rozwiązania miałyby zastosowanie - za pomocą blokowania lub używania instancji dla wątków zamiast wystąpień statycznych.

+0

Bardzo dziękuję za dobre wyjaśnienie, myślę, że to się dzieje, ponieważ jest to statyczna metoda, ja to zmienię. – Katya

+0

@ user1023623 Może być o jeden poziom wyżej w 'GetCurrentUserID()' lub wewnątrz DAL. W pewnym momencie masz metodę, która odwołuje się do statycznej zmiennej, która jest współdzielona między wątkami. Zmienne lokalne powinny być bezpieczne dla wątków, ponieważ każdy wątek ma własny stos. – tvanfosson

+0

GetCurrentUserID() jest również statyczną metodą zwracającą HttpContext.Current.User.Identity.Name. Czy może zwrócić niewłaściwą Tożsamość.Nazna z tego powodu? – Katya