2016-04-21 91 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> 

(我会发表过评论,但我不能添加评论吗?):)