一种恢复丢失会话值的方法

时间:2012-10-12 15:52:59

标签: asp.net session-variables

我的Web应用程序由于某种原因丢失了会话值,并且在调用外部网页后发生。我的应用程序很大,所以任何重大改变都需要太多时间。我的数据库是Oracle,而不是Sql Server。

是否有另一种方法来存储这些会话变量的值?实际上我只需要保留两个会话变量。

我在考虑将这些值存储在Oracle表中。密钥是SessionID。我读到SessionID即使在其他会话变量被回收或丢失之后也保持其值,但我不完全确定。

我打算在Page_Load mewthod上为每个页面添加一个函数,检查会话变量是否仍然存在。如果没有,那么转到Oracle表并检索它。

类似的东西:

If Session("MyVariable") Is dbNull.Value Then
  Seek it on Oracle table, using SessionID as Key, and assign to variable Var
  Session("MyVariable") = Var
End If
你觉得它会好吗?我可以信任SessionID吗?

1 个答案:

答案 0 :(得分:1)

嗯,我想到了4种会话类型:

(1)进行中模式

在此模式下,会话状态存储在当前进程中,当此进程终止时,会话状态中保存的数据也将丢失。此模式在ASP.NET中默认设置,在下面您可以看到在web.config文件中配置此类状态的示例:

<configuration> <sessionstate mode="inproc" cookieless="false" timeout="30" sqlconnectionstring="data source=127.0.0.1;user id=user;password=pass" server="127.0.0.1" port="42424" />  

此会话状态的最重要参数如下:

  • 模式 - 此参数可以有三个值 - inproc, sqlserver,stateserver。我们的示例中的值inproc表示 会话状态处于进程中模式
  • cookieless - 此参数的布尔值表示会话状态是否需要cookie才能正常工作
  • timeout - 表示会话有效的时间。每次用户与您的应用程序交互时,超时都会设置为 当前时间加上超时值

这种模式的最大优点是性能。流程之间没有数据传输,所以它的速度要快得多。

(2)进程外模式

在此模式下,会话存储在单独的进程中,因此可以终止其他进程并仍然维护会话状态。这是用于进程外模式的web.config中会话状态的示例配置:

<configuration> <sessionstate mode="stateserver" cookieless="false" timeout="30" sqlconnectionstring="data source=127.0.0.1;user id=user;password=pass" server="127.0.0.1" port="42424" />  

在下面,您可以在进程外模式下查看会话状态的参数:

  • mode - 为stateserver设置的值表示它在进程外模式下工作
  • service - 表示状态服务所在的服务器,在本例中是localhost
  • port - 表示状态服务的端口

正如我前面提到的,这种模式的优点是你不会因为进程而松开会话状态,但它的性能比进程内模式差。

(3)SQL Server模式

在SQL Server模式下,会话状态存储在SQL Server中。要配置它,您必须将以下代码放在web.config文件中:

<configuration> <sessionstate mode="sqlserver" cookieless="false" timeout="30" sqlconnectionstring="data source=server_name;user id=user;password=pass" server="127.0.0.1" port="42424" />  

此模式中最重要的参数是:

  • mode - 设置为sqlserver值表示会话状态应该在SQL服务器模式下工作
  • sqlconnectionstring - 它包含一个字符串,其中包含服务器的名称,SQL Server的用户名和密码

在这种模式下,最大的优势是可靠性,你不会失去会话状态,但缺点是它比以前的模式慢。

(4)无Cookie

在此模式下,无需启用客户端浏览器中的cookie。此模式通过修改标识会话的ID的URL地址来工作。配置如下:

<configuration> <sessionstate mode="stateserver" cookieless="true" timeout="30" sqlconnectionstring="data source=127.0.0.1;user id=user;password=pass" server="127.0.0.1" port="42424" />  

对于此模式至关重要的参数是“无cookie” - 在我们的示例中设置为true,这意味着不需要cookie来维护状态。您已经知道此解决方案的优势是什么 - 它不需要cookie。

<强>建议:

如果您以某种方式丢失会话值,请尝试(2)进程外模式或(3)SQL Server模式。这两种模式都可以为您的会话提供更长,更持久的生命周期。这些通常用于大型生产站点,会话必须在用户访问期间保持活动状态。正如我之前提到的那样,唯一的缺点是性能。虽然这不会影响你的应用程序,如果它是一个中小型应用程序。

这不会让你失去的会话回来,但它会帮助你保持活力。希望这至少帮助你了解一下。