【问题标题】:SQL Server session state in ASP.NETASP.NET 中的 SQL Server 会话状态
【发布时间】:2014-09-17 20:14:48
【问题描述】:

我有一个托管在共享托管服务器上的网站。目前我正在使用进程内会话状态,但我遇到的问题是每当我更改代码时(主要在App_Code 中注意到),我的会话中断并且用户已注销。我有一些问题:

  1. 有什么可以帮助我在更改代码时避免丢失会话?
  2. 如果这是它的正常行为,那么切换到 SQL Server 会话状态如何?
  3. 我可以在共享主机服务器上配置它吗?步骤是什么?
  4. 我是否可以使用普通的Session 对象访问会话,还是需要采用通常的数据库连接方式?

我尝试使用aspnet_regsql 命令从本地计算机配置它,并为托管服务器提供了数据库IP。它成功完成,但是当我对web.config 文件进行更改时它没有工作。

这些是我对web.config的更改:

<sessionState
   mode="SQLServer"
   sqlConnectionString="data source=[DB IP];user id=username;password=password;initial catalog=[db name on production]"
/>

我在这里做错了吗?

【问题讨论】:

  • SQL 可以正常工作,如果您认真地保持会话完好无损(尤其是在共享主机上),它绝对比 in-proc 更受欢迎 - 但请注意它的速度要慢得多,而且您还必须确保您存储在会话中的所有内容都是可序列化的。一旦您接受了这一点,您就可以使用您想要的任何 SQL Server 实例,只要您正确设置了数据库对象。如果您在连接到正常工作的 SQL 会话实例时遇到问题,您需要提供有关问题所在的更多详细信息。
  • 您所做的似乎是正确的。您是否能够查看 SQL 中的数据并确认您的会话数据存储在那里?

标签: asp.net sql-server session-state


【解决方案1】:

检查会话状态模式http://msdn.microsoft.com/en-us/library/vstudio/ms178586%28v=vs.100%29.aspx

您需要使用“in-proc”以外的其他内容。

在共享主机方面 - 我只有 discountasp.net 的经验,并且正在使用 sql server 会话状态,没有任何问题。它需要另一个数据库,但运行良好。

我也猜你必须使用:

allowCustomSqlDatabase="true"

在您的网络配置中,会话的数据库名称与默认名称不同。

检查这个http://msdn.microsoft.com/en-us/library/h6bb9cz9%28v=vs.90%29.aspx

【讨论】:

    【解决方案2】:

    我真的只能回答你的第一个问题:

    “1. 有什么可以帮助我在更改代码时避免丢失会话?”

    令人烦恼的是,没有什么可以做的。一旦您“反弹”网站(例如修改 web.config),您将导致所有会话结束,并且每个人都将因登录数据丢失而被注销。

    听起来您最好将其更改为使用 FormsAuthentication(这是 MVC.NET 代码,但该代码对其他 asp.net 应用程序仍然有效),因为它在代码更改时是稳定的,例如

    using System.Web.Security;
    
    public function ActionResult Login(LoginModel model)
    {
        var password = FormsAuthentication.HashPasswordForStoringInConfigFile(model.Password 
        + System.Configuration.ConfigurationManager.AppSettings["salt"].ToString(), "sha1");
    
        if (new UserService().Login(model.EmailAddress, password))
        {
            FormsAuthentication.RedirectFromLoginPage(model.EmailAddress, true);
        }
    }
    

    使用 FormsAuthentication 意味着您的用户将被 asp.net 领域“记住”,并且更改 web.config 不会终止他们登录的会话。

    如果您使用此方法,但仍希望在用户关闭浏览器时将其注销,您可以在上面登录时设置会话 cookie,标准会话 cookie 不是跨代码易变的会话变量变化。当用户关闭浏览器时,该 cookie 将被浏览器关闭。 cookie 可以像“loggedIn:yes”一样简单。此 cookie 以及对 FormsAuthentication Identity 值的检查,例如

    if(!HasLoginCookie() || !System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
    {
       // redirect user to log in page.
    }
    

    如果 cookie 已被删除,则会将用户注销。 FormsAuthentication 也会在一段时间不活动后自动注销,这增加了额外的安全层。希望这会有所帮助。

    【讨论】:

    • 这是不正确的,只有当会话数据存储在进程中时,会话才应该结束。 OP 表示他们正在尝试使用进程外会话存储。
    • 我不同意你的评论。开场白写道:“目前我正在使用进程内会话状态”
    • 抱歉,当我试图澄清我的陈述时,我的笔记本电脑死了。会话变量对代码的更改是易变的,因此使用存储在 Session 中的登录信息是危险的。这可以通过一个简单的网页来证明。 if (Session["userId"] == null) { Session["userId"] = Guid.NewGuid().ToString(); } litUserID.Text = Session["userId"].ToString(); 运行页面,见Guid。更改 web.config 中的某些内容。重新运行页面。请参阅指南更改。 4guysfromrolla.com/webtech/faq/Advanced/faq4.shtml我相信我的帖子仍然有效,即使两次投票都没有真正的答案。
    • 开头的语句确实读到了这一点,但是他随后请求帮助获取存储在 SQL Server 中的会话数据。然后你的回答开始“恼人地没有什么可以做”,而没有提到你只是指他的第一点(他似乎已经意识到了)。
    • 好的。我会接受你的观点。我主要是问最初的问题“当我更改代码时,有什么可以帮助我防止丢失会话吗?”我回答了,但是是的,你是对的,我不清楚我只是在回答这个问题。我将编辑我的答案以反映这一点。
    猜你喜欢
    • 2019-10-28
    • 2012-12-11
    • 2011-07-21
    • 1970-01-01
    • 2012-03-02
    • 2010-12-21
    • 2018-12-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多