2016-04-21 120 views
1

我在DataEntityLayer一些變量,它是通用於所有的用戶,例如變量變爲空

public class DataEntityLayer : System.Web.UI.Page 
{ 
    public string UserName 
     { 
      get 
      { 
       if (Session["UserName"] == null) 
       { 
        GotoLoginPage(); 
        return null; 
       } 
       else 
        return Session["UserName"].ToString(); 
      } 

      set { Session["UserName"] = value; } 
     } 
} 

我使用這個變量顯示用戶名時,該用戶登錄時工作正常,但進入空經常。如何避免這種情況或讓我知道一種方法來聲明我的圖層中的變量以顯示用戶登錄時的用戶名。

回答

5

會話是臨時內存,在定義的時間量後過期,我相信默認情況下是20分鐘不活動。

也可能是因爲您使用多臺服務器進行負載平衡。除非會話保存在數據庫中,否則當您從一臺服務器移動到另一臺服務器時,會話將丟失。

我建議避免這種方法出於上述原因。有更好和更安全的方式來處理認證。

P.S名爲DataEntityLayer的對象不應該從System.Web.UI.Page派生!

+0

我需要實例我Dataentitylayer每個班,我不得不使用它的變量? –

+0

這只是命名爭議。通過從System.Web.UI.Page派生它是一個網頁,所以它不能進一步成爲與數據訪問有關的東西。關於身份驗證,我會推薦使用.Net Identity之類的東西。你對安全性不太瞭解(不是我),所以讓專家爲你照顧。 –

2

關於安全性,我完全同意@johnMc,最好使用提供整體解決方案的庫或包。爲了完整起見,會話丟失的原因也可能是在多線程應用程序上運行服務。如果使用IIS,您可以打開一個名爲「ASP.Net狀態服務」的服務,然後在您的Web配置中啓用它。這爲ASP.net提供了進程外會話處理。還有一種方法可以使用非IIS連接到此服務,但您必須構建一個通信器類來處理此問題。這個過程有一個很小的性能影響,但我從來沒有遇到任何高負載問題。

<system.web> 
    <sessionState mode="StateServer" /> 
</system.web> 

(我會發表過評論,但我不能添加評論嗎?):)