好吧,我想到了 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 模式。这两种模式都可以让您的会话更长、更持久。这些通常用于大型生产站点,在用户访问期间会话必须保持活动状态。正如我之前提到的,唯一的缺点是性能。尽管如果它是中小型应用程序,这不会对您的应用程序产生太大影响。
这不会让您丢失的会话恢复,但它会帮助您保持它们的活力。希望这至少对您有所帮助。