0

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

4

1 回答 1

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、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 server 模式下工作
  • sqlconnectionstring - 它包含一个带有服务器名称、SQL 服务器用户名和密码的字符串

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

(4) 无饼干

在这种模式下,不需要启用客户端浏览器中的 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 模式。这两种模式都可以让您的会话更长、更持久。这些通常用于大型生产站点,在用户访问期间会话必须保持活动状态。正如我之前提到的,唯一的缺点是性能。尽管如果它是中小型应用程序,这不会对您的应用程序产生太大影响。

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

于 2012-10-12T19:29:57.557 回答