我的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吗?
答案 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" />
此会话状态的最重要参数如下:
这种模式的最大优点是性能。流程之间没有数据传输,所以它的速度要快得多。
(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" />
在下面,您可以在进程外模式下查看会话状态的参数:
正如我前面提到的,这种模式的优点是你不会因为进程而松开会话状态,但它的性能比进程内模式差。
(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" />
此模式中最重要的参数是:
在这种模式下,最大的优势是可靠性,你不会失去会话状态,但缺点是它比以前的模式慢。
(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模式。这两种模式都可以为您的会话提供更长,更持久的生命周期。这些通常用于大型生产站点,会话必须在用户访问期间保持活动状态。正如我之前提到的那样,唯一的缺点是性能。虽然这不会影响你的应用程序,如果它是一个中小型应用程序。
这不会让你失去的会话回来,但它会帮助你保持活力。希望这至少帮助你了解一下。