2012-02-26 16 views
6

In un ambiente in cui circa 100 + gli utenti accedono a un sito con l'autenticazione forme, chiamando HttpContext.Current.User.Identity.Name restituisce il corretto utente connesso .Problema con HttpContext.Current.User.Identity.Name

Tuttavia, il 10% delle volte viene restituito l'errore Nome utente completo. Non ho mai avuto problemi di questo tipo sulla mia macchina di prova, succede solo nella produzione. Non riesco a ricreare lo stesso ambiente con molti utenti sulla mia macchina di prova.

La logica di questa app:

1) L'utente inserisce il nome utente e passare, informazioni viene cercato tramite SQL DB chiamata, se incontro, l'utente viene autenticato tramite FormsAuthentication.RedirectFromLoginPage (nome utente, 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) Dopo redirect ho messo il nome completo dell'utente nel campo nascosto

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) su tutte le pagine le visite degli utenti, il suo/h le informazioni sono mostrate all'interno dell'etichetta che si trova sulla pagina principale

lblUserName.Text = HttpUtility.HtmlDecode("Hello " + userFullName.Value); 

Questo funziona quasi sempre. Qualche idea sul perché potrebbe non essere disponibile a partire da ?

+1

Mostraci il codice per il tuo metodo 'GetCurrentUserFullName()'. – tvanfosson

+0

Cosa intendi per informazione errata? È il nome di qualcun altro? È vuoto? – Aliostad

+0

Come viene dichiarata la variabile userFullName? –

risposta

1

Assente altro codice, posso solo indovinare il tuo problema. Dal momento che altre persone potrebbero trovare la tua domanda e avere problemi simili, immagino che il tuo problema risieda nell'errato utilizzo di classi o proprietà statiche.

Il tuo metodo GetCurrentUserFullName() può fare affidamento su un metodo di accesso ai dati che è condiviso in modo statico tra tutti i thread. Potrebbe esserci una condizione di competizione nelle classi di accesso ai dati che a volte risulta nell'id dell'utente che viene cercato di essere sostituito da un'altra richiesta prima che i dati vengano recuperati. La soluzione a questo è (a) utilizzare i blocchi in tutte le sezioni critiche delle classi di accesso ai dati o (b) utilizzare una soluzione che istanzia una nuova classe (i) di accesso ai dati per ogni richiesta (in realtà ogni unità di lavoro). Quest'ultima progettazione richiede che le classi di accesso ai dati siano leggere, ma sarebbe preferibile in quanto sarà anche più facile da testare.

È anche possibile, se si memorizzano nella cache valori in proprietà statiche o in altre classi statiche condivise tra thread, si ha una condizione di competizione simile in cui tali valori vengono memorizzati nella cache e utilizzati. Verrebbero applicate soluzioni simili, utilizzando il blocco o l'utilizzo di istanze per thread anziché istanze statiche.

+0

Grazie mille per la buona spiegazione, penserò che succede perché è un metodo statico, lo cambierò. – Katya

+0

@ user1023623 Potrebbe essere un altro livello in basso in 'GetCurrentUserID()' o all'interno del DAL. Ad un certo punto si dispone di un metodo che fa riferimento a una variabile statica condivisa tra thread. Le variabili locali dovrebbero essere thread-safe poiché ogni thread ha il proprio stack. – tvanfosson

+0

GetCurrentUserID() è anche un metodo statico che restituisce HttpContext.Current.User.Identity.Name. Può restituire un Identity.Name errato a causa di questo? – Katya