Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 会话存储与类存储_C#_Asp.net_Class_Session Variables - Fatal编程技术网

C# 会话存储与类存储

C# 会话存储与类存储,c#,asp.net,class,session-variables,C#,Asp.net,Class,Session Variables,我总是将用户(登录后)的数据存储在会话变量中,因此我可以在任何页面上使用该数据。 我发现另一种全局存储信息的方法是将信息存储在类中,使用{get;set;},然后从任何页面调用它 现在,我使用了这两种方法作为测试,它们都非常有效: Session[“LoginId”]=rdr[“uniqueIdentifier”].ToString() 及 Member.LoginId=rdr[“uniqueIdentifier”].ToString() 其中(在Member.cs中) Global.asax

我总是将用户(登录后)的数据存储在会话变量中,因此我可以在任何页面上使用该数据。
我发现另一种全局存储信息的方法是将信息存储在类中,使用
{get;set;}
,然后从任何页面调用它

现在,我使用了这两种方法作为测试,它们都非常有效:

Session[“LoginId”]=rdr[“uniqueIdentifier”].ToString()

Member.LoginId=rdr[“uniqueIdentifier”].ToString()

其中(在Member.cs中)

Global.asax

void Session_End(object sender, EventArgs e) 
    {
        Member.ClearVariables();
    }
我的问题是,在这样的类中存储用户数据是否足够安全,还是应该坚持使用
Session
对象

更新完整性 这篇文章会像上面那样做吗,但对多个用户来说?

在您的情况下,这是不安全的,因为asp.net中的静态变量对所有用户都是通用的。

第二种方法的缺点是,当应用程序重新启动时,变量将丢失其值。但通过会话,您的数据将存储在浏览器cookie中

编辑:


只有在需要应用程序级公共共享(在所有用户之间)变量时才使用静态变量。

使用静态变量是不安全的。为一个用户设置的值将覆盖另一个用户的值。
静态变量意味着只创建一个变量并用于所有会话。 静态变量的生命周期就是应用程序的生命周期。

如果您的变量是特定于用户的(看起来是),那么您需要坚持使用会话变量。

我确信它不适合您。类的实例仅在处理请求时存在。处理请求后,您将无法再次获取该类的实例。对于静态变量,它是应用程序范围的,不适合存储用户特定的信息


会话设计用于在回发过程中处理应用程序的状态,它是会话的唯一目的,即维护应用程序的状态,非常适合您的要求。

会话是根据每个用户创建的,而类在生产过程中在应用程序的整个生命周期中都是活动的

虽然您可能不会在仅使用一个用户的开发过程中遇到问题,但在生产过程中,每个请求都会覆盖以前的数据,因此可能会带来安全风险


坚持使用会话。

我发现这种方法是最容易使用的方法之一,而且错误几率最小。我认为这就是所谓的立面设计模式

 public class SiteSession
{
    #region Attributes
    private static string _siteSession = "__SiteSession__";
    #endregion

    #region Constructor
    private SiteSession()
    {
    }
    #endregion

    #region CurrentSession
    public static SiteSession Current
    {
        get
        {
            SiteSession session = HttpContext.Current.Session[_siteSession ] as    SiteSession;
            if (session == null)
            {
                session = new SiteSession();
                HttpContext.Current.Session[_siteSession ] = session;
            }
            return session;
        }
    }
    #endregion

    #region SessionProperties
    public sherserve.CustomTypes.UserTypes UserType { get; set; }
    public int UserID { get; set; }
    public String StaffID { get; set; }
    public String Position { get; set; }
    public String StaffName { get; set; }
    public int TimeZone { get; set; }

    public String DealerId { get; set; }
    public String DealerPosition { get; set; }
    public String DealerName { get; set; }
    public int DealerFirmId { get; set; }

    public String ClientId { get; set; }
    public String ClientName { get; set; }
    public String ClientBusiness { get; set; }
    public String CountryCode { get; set; }
    public int ClientFirmId { get; set; }
    #endregion

}
值可以存储在会话中,如下所示:

 SiteSession.Current.UserType = user.UserType;
可以这样得到:

int userId=    SiteSession.Current.UserID;

它也是类型安全的。

因此,用外行术语来说,任何在前一个用户之后登录的用户都会销毁前一个用户的数据,并将其替换为自己的数据?是的,这是一个单用户系统。您是否尝试与多个用户一起使用它?目前还没有。到目前为止,我只在测试中使用过这个方法。即使使用会话也可能是一个问题。如果您需要在负载平衡器后面使用多个服务器,则需要确保每个用户请求始终转到同一服务器,以便它们始终具有相同的会话。这可以通过粘性IP地址实现,但有回退;为什么不两全其美呢。更改
成员
类以停止使用静态变量,然后在
会话中创建一个新的
成员
实例_Start@Global.asax
并将其分配给当前会话。@DaveAnderson-或使用状态服务器或SQL server会话状态(或者我相信还有其他解决方案也可以跨多个web服务器实现共享会话状态)谢谢。快速回复总是很受欢迎的:在我把事情搞砸之前,你能在aspx.cs页面上给出使用它的代码吗?as TraccrSession
来自哪里?现在检查一下,实际上Traccr是我的项目名称,在给你之前,我试着到处替换它。如果你仍然在代码中找到它st将其更改为SiteSession。我保留了
会话。放弃
会话。在我的注销按钮上清除
,这似乎可以清除所有内容。我的理论是,它会破坏存储用户梦想的会话。哈哈,我仍然在尝试;因此,阅读本文的任何其他人都会知道,如果会话存储在proc中,那么会发生什么n应用程序重新启动是否会导致会话丢失?
int userId=    SiteSession.Current.UserID;