【问题标题】:where should I create user sessions?我应该在哪里创建用户会话?
【发布时间】:2012-01-24 21:56:52
【问题描述】:

我正在使用 VS2010,C# 开发一个自动化站点(ASP.NET Web 应用程序),它可能同时拥有数百个用户。我几乎完成了网站的创建,但我知道我犯了一些错误,其中一个是在代码隐藏页面上使用公共静态变量,而不是为每个用户使用会话,现在当用户 A 更改页面中的设置时,用户 B也以与用户 A 查看页面完全相同的方式查看页面!而不是在默认状态下查看页面。我有个问题: 我应该在哪里为每个用户声明我的会话?当用户登录时,我为每个用户创建一个会话,这是我迄今为止使用的唯一会话:

Session.Add("userid" + myReader["ID"].ToString(), "true");

我应该在这里创建其他必要的会话吗?即在登录时?例如,我在负责查看数据库的页面上声明了一些公共静态变量:

        public static string provinceid = "0";//0 means all
    public static string branchid = "0";
    public static string levelid = "0";
    public static string groupid = "0";
    public static string phrase = "";

我应该在登录时为他们每个人声明一个会话吗?或者我可以在每个页面启动时声明它们吗?

谢谢

【问题讨论】:

  • 您不应该将实际的 UserID-Value 添加到 Session-Key,因为会话已经是用户独立的。例如:Session.Add("UserID", myReader["ID"].ToString());

标签: c# asp.net session


【解决方案1】:

Session 对象对于每个用户来说都是唯一的 - 您不需要“创建”它。

使用静态变量会导致这些项目在所有线程之间共享(所以所有用户)。这些可能应该转换为会话变量。

【讨论】:

  • 是的,没错,但我想知道我应该在哪里声明它们?我应该在用户登录后将所有公共静态变量声明为会话吗?即在 Session.Add("userid" + myReader["ID"].ToString(), "true");?是对的地方吗?
  • @Ali_dotNet - 你根本不应该有静态。什么时候声明它们并不重要。他们将成为该用户会话的一部分,无论是否登录。如果您只想在登录后设置这些,那么您需要设置它们。
  • @Ali_dotNet - 同样,如果他们只需要在登录期间存在,那么可以。
  • @Ali_dotNet:但是Session值不需要分类删除,因为如果Session超时,它们会自动处理(默认20分钟)。msdn.microsoft.com/en-us/library/…不要混用用户的与会话的身份验证状态,它们是独立的。因此,当用户仍然登录时会话可能会超时,并且用户可以注销但会话仍然存在。
【解决方案2】:

您只需执行以下操作即可:

Session["provinceid"] = "0";
Session["branchid"] = "0";
Session["levelid"] = "0";
Session["groupid"] = "0";
Session["phrase"] = "";

正如his answer中的Oded所说,Session对于用户来说已经是唯一的,所以不需要使用“Add”方法。

当您完成此信息(用户注销等)后,您可以使用Session.Clear() 方法,该方法从Session 对象中删除所有键和值。

【讨论】:

  • 谢谢,但是如何销毁由 Session["a"] = "b" 创建的会话?
  • @Ali_dotNet 你可以使用Session.Clear()。这将清除 Session 对象中的所有键和值。我会将其添加到答案中。
【解决方案3】:

我知道我犯了一些错误,其中一个是使用 public 代码隐藏页面中的静态变量

你是对的。在网络应用程序上这样做是一件非常糟糕的事情。

您不需要创建用户会话,因为它已经在用户第一次访问您的网站时自动创建。为了以您想要的方式使用 Session,您需要的是这样的:

//Store value 
Session["Key"]=myValue;


//retrieve field
var myValue = Session["Key"];

您可以在任何您想要的页面上执行此操作,因为 Session 是一个全局对象;它不需要在登录页面上完成,但只要您需要存储特定于用户的任何内容。

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2021-12-26
    • 2013-07-05
    • 1970-01-01
    • 2012-08-24
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多