在页面之间存储ID最多一天?

时间:2010-01-20 17:56:12

标签: asp.net session viewstate

我需要在多个.aspx页面之间存储ID(联系人ID,声明ID等)。

目前我将ID存储在Session中并将会话超时设置为300分钟。但是,由于用户在Session过期后尝试执行操作,我仍然会收到错误。

我认为用户正在打开他们的网络浏览器,锁定他们的电脑,晚上回家,第二天早上来,并试图从他们离开的地方继续。

我不想使用Querystring。用户ID的Cookie比联系人ID和声明ID更多。 Viewstate仅在每页维护。持久化会话到数据库似乎不必要地复杂化。我不想过多地延长Session超时。

我希望他们能够在早上离开的地方接他们。

处理页面之间存储ID的最佳做法是什么?如果没有他们收到说他们的会话已经过期的消息,我怎么能这样做呢?我忽略了一些明显的东西吗?!

4 个答案:

答案 0 :(得分:3)

我会把所有这些信息都放到数据库中。这是数据库的经典用法,是存储应用程序所需信息的一种方法。

Cookie很糟糕,因为您必须假设它们将在会话期间位于同一台PC上。你似乎遇到了会话的问题。

如果您不想使用数据库,则可以使用服务器上的文件。并从该文件中读取。

答案 1 :(得分:1)

实际上,您可能会发现创建一种存储用户项目历史记录的“登陆区”数据库或MRU列表比复杂更容易。我不会把它绑在他们的直接会话或cookie上。让会话保持用户状态,让数据库处理他们回家或休息7小时的时间。

答案 2 :(得分:1)

正如@David所说,这是数据库的经典用法。

如果您需要在不使用数据库的情况下执行此操作,则可以使用非动态语言中使用的一些“技巧”(读取黑客):

  1. 创建一个存在于每个页面上的隐藏字段,根据您要存储的数据为该字段命名。
  2. 当您呈现页面时,创建一个包含您的ID和其他数据的XML片段,加密它以用于显示目的(使用base64等),将值放入您创建的隐藏字段中。
  3. 当页面被回发时,反向#2并恢复您的数据,然后应用页面更改。
  4. 冲洗并重复。 :)
  5. 实际上这不是一个非常可扩展的解决方案,因为XML和base64编码会为您的数据大小增加50%或更多,如果有大量数据(100的KB),这个过程可能会失控。

    上一次我被要求使用此解决方案时,它是用于移动一个定义良好的数据列表,其中包含一个并不总是可以访问数据库的应用程序。它可以用于此目的,但绝对不是理想的。

答案 3 :(得分:0)

您可以继续将ID存储在页面的viewstate中,然后在每个要求该ID具有该页面的可设置属性的页面上。在重定向到页面之前,实例化它并设置ID属性。

你是对的,在会话中存储这种类型的数据实际上并不是它的意思。 Viewstate是一种更好的机制。