【问题标题】:A way to get back lost session values找回丢失的会话值的方法
【发布时间】:2012-10-12 15:52:59
【问题描述】:

我的 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 吗?

【问题讨论】:

  • 你也可以使用cookies来存储id和values。
  • 还有篡改cookie的问题?

标签: asp.net session-variables


【解决方案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" />  

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

  • mode - 这个参数可以有三个值 - inproc, sqlserver,状态服务器。我们示例中的值 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 - 表示状态服务所在的服务器,在本例中是本地主机
  • 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 server 模式下工作
  • sqlconnectionstring - 它包含一个带有服务器名称、SQL 服务器用户名和密码的字符串

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

(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" />  

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

建议:

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

这不会让您丢失的会话恢复,但它会帮助您保持它们的活力。希望这至少对您有所帮助。

【讨论】:

  • 谢谢。我将会话状态更改为“状态服务器”。一个问题。我的服务器有 2gb 的内存并且是虚拟化的。您认为现在会话变量作为“状态服务器”运行会需要更多内存吗?
  • 2Gb 的内存对于中小型站点应该可以正常工作。请记住,您在内存中保存的只是文本或变量,它们不会消耗太多。
猜你喜欢
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多