【问题标题】:Session Best Practices会话最佳实践
【发布时间】:2015-03-12 03:23:21
【问题描述】:

您好,我在我的应用程序中使用了会话,我想知道在页面上维护会话值的最佳做法是什么。我需要保存会话中存储的值,直到回帖到特定页面。让我举例说明:

Page A:                             Page B:
Sets Session["ID"] = 5       -->    Gets Session["ID"]
And redirects to Page B             and populates data.

我需要页面 B 上的 Session["ID"] 保持活动状态,直到在页面 B 上执行回发。我需要这个,因为我将使用 Session["ID"] 的值更新数据库中的数据。

我的问题是:在执行回发之前,Session["ID"] 是否会保持其价值?它不会死吗?如果是这样:我可以采取哪些方法来确保它保持其价值?

我正在考虑在页面 B 中创建一个私有变量以将 Session["ID"] 存储在 Page_Load 上。请告诉我你的想法,谢谢。

对不起,我应该说:我不能允许用户修改ID。所以不用Query Strings,谢谢。

【问题讨论】:

    标签: asp.net session-variables


    【解决方案1】:

    会话默认存储在服务器的内存中。如果用户的会话超时,这可能会出现问题。此外,如果您将多个服务器用作场,则不能在内存中使用 Session,因为您不能保证用户每次都会使用相同的服务器。

    保证会话信息不会丢失的最佳方法是将用户的会话持久化到 SqlServer 数据库。 Here is a tutorial on how to set that up.

    Session 并不像某些海报所暗示的那样是性能杀手。这是一种非常有用的方式,可以轻松维护每个用户的状态。

    另请参阅我对this question 的回答,了解包装 ASP.NET 会话对象的好方法。

    【讨论】:

    • faqfront.com 不再可用。
    【解决方案2】:

    由于您使用的是asp.net,并且您想将数据从一个页面传输到另一个页面,您也可以使用CrossPage postback

    来自 msdn 的跨页回发:

    在某些情况下,您可能 想将一页发布到另一页。 例如,您可能正在创建一个 收集的多页表单 每一页都有不同的信息。在 在这种情况下,您可以配置某些 控制(那些实施 IButtonControl 接口,如 按钮控件)在要发布到的页面上 不同的目标页面。这是 称为跨页发布。 跨页发布提供了一些 与使用 Transfer 相比的优势 方法重定向到另一个页面。 有关详细信息,请参阅将用户重定向到 另一个页面。

    if (Page.PreviousPage != null)
    {
        TextBox SourceTextBox = 
            (TextBox)Page.PreviousPage.FindControl("TextBox1");
        if (SourceTextBox != null)
        {
            Label1.Text = SourceTextBox.Text;
        }
    }
    

    来源:http://msdn.microsoft.com/en-us/library/ms178139.aspx

    这是我们在一些项目中使用的方法,效果很好。我不知道它是否适合您的需求,但可能值得一看。

    【讨论】:

      【解决方案3】:

      会话变量在会话超时之前保持活动状态(超时时间在您的 web.config 文件中指定)

      您需要记住,在会话中持久化数据会占用服务器上的资源,因此您需要小心。

      在 asp.net 中,您可以使用视图状态在同一页面上跨回发保持数据。

      对于您的问题,我建议使用 URL 查询字符串参数在页面之间传递 ID

      即myurl.aspx?ID=5

      然后在您的 aspx 代码中执行:

      int ID = (int)page.request.params["ID"];
      

      编辑:

      如果您担心用户更改 ID 参数,您可以将业务逻辑放在页面 B 的页面加载中,以确保用户拥有更改该 ID 值的适当权限。

      【讨论】:

        【解决方案4】:

        如果会话超时,您的价值当然会丢失。您可以将其存储在页面加载的变量中 - 这应该可以。

        我真正想知道的是,当您从页面 A 重定向到页面 B 时,为什么不直接将其作为 GET 参数传递?你可能有一个完全正当的理由,但通常如果我想将数据从一个页面传递到另一个页面,我会这样做。

        【讨论】:

          【解决方案5】:

          您可以通过查询字符串或通过隐藏的帖子字段在页面之间传输变量,而不是使用会话,这样它将与客户端一起使用,并且不会像在会话中那样超时。

          编辑:如果您不希望用户篡改您可以加密/混淆隐藏的帖子字段的值。

          【讨论】:

          • 我不能让用户篡改这些值
          【解决方案6】:

          如果我们有一个不需要会话超时的页面,那么按照

          来源:https://msdn.microsoft.com/en-us/magazine/cc163730.aspx

          我们可以使用

          该链接还讨论了各种最佳实践。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-24
            • 2019-07-09
            • 2017-12-22
            • 2016-01-03
            • 2010-11-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多