会话最佳实践

时间:2009-03-13 18:12:47

标签: asp.net session-variables

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

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,谢谢。

6 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

由于您使用的是asp.net,并且您希望将数据从一个页面传输到另一个页面,因此您也可以使用CrossPage回发

来自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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

会话变量保持活动状态,直到会话超时(在web.config文件中指定超时时间)

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

在asp.net中,您可以使用viewstate在同一页面上的回发中保存数据。

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

即。 myurl.aspx?ID = 5

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

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

修改

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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

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

我们可以使用<%@ Page EnableSessionState =“False”%>

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