2012-02-26 62 views
6

在約100多名用戶登錄到具有 表單身份驗證的站點的環境中,調用HttpContext.Current.User.Identity.Name 會返回正確登錄的用戶。問題與HttpContext.Current.User.Identity.Name

但是,有10%的時間錯誤的用戶全名信息正在返回。 我的測試機器上從來沒有這樣的問題,它只發生在生產中。我無法在測試機器上爲許多用戶重新創建相同的環境。

此應用的邏輯:

1)用戶輸入用戶名和傳遞,信息經由SQL DB呼叫擡頭,如果匹配,用戶經由 FormsAuthentication.RedirectFromLoginPage(用戶名,假)

認證
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)重定向後,我把用戶的全名進藏實地

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)上的所有網頁的用戶訪問,他/小時呃信息的內部標籤,該標籤是母版頁

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

上顯示這個工程幾乎所有的時間。任何想法爲什麼它可能會從 不及格?

+1

請向我們展示您的'GetCurrentUserFullName()'方法的代碼。 – tvanfosson 2012-02-26 13:33:18

+0

你的錯誤信息是什麼意思?這是別人的名字嗎?它是空白的嗎? – Aliostad 2012-02-26 13:34:00

+0

如何聲明變量userFullName? – 2012-02-26 13:34:11

回答

1

如果缺少更多的代碼,我只能猜測你的問題。由於其他人可能會發現你的問題,並有類似的問題,我猜你的問題在於錯誤地使用靜態類或屬性。

您的GetCurrentUserFullName()方法可以依賴於在所有線程之間靜態共享的數據訪問方法。在數據訪問類中可能存在競爭條件,這有時會導致在檢索數據之前搜索用戶的id被替換爲來自另一個請求的id。解決方案是(a)在數據訪問類的所有關鍵部分中使用鎖,或者(b)使用爲每個請求實例化新數據訪問類的解決方案(實際上每個工作單元)。後一種設計要求您的數據訪問類是輕量級的,但是會更好,因爲它也更容易測試。

如果您在靜態屬性或其他可以在線程之間共享的靜態類中緩存值,也可以使用緩存和使用這些值的類似競爭條件。類似的解決方案將適用 - 使用鎖定或使用每個線程實例,而不是靜態實例。

+0

非常感謝您的好解釋,我會認爲這是因爲它是一種靜態方法,我會改變它。 – Katya 2012-02-26 14:43:11

+0

@ user1023623在'GetCurrentUserID()'或DAL內可能會降低一級。在某些時候,你有一個方法引用一個在線程之間共享的靜態變量。因爲每個線程都有自己的堆棧,所以局部變量應該是線程安全的。 – tvanfosson 2012-02-26 14:52:53

+0

GetCurrentUserID()也是一個返回HttpContext.Current.User.Identity.Name的靜態方法。它可以返回一個錯誤的Identity.Name嗎? – Katya 2012-02-26 14:57:20