ASP.NET 会话状态为会话数据提供了几个不同的存储选项。每个选项都通过一个 SessionStateMode 枚举值进行识别。如下列表中描述了可用的会话状态模式:

  • InProc 模式:把会话状态存储到 Web 服务器的内存中。这是默认值。
  • StateServer 模式:把会话状态存储到一个名为 ASP.NET 状态服务的单独进程中。如果 Web 应用程序被重启并同样为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么就能够确保会话状态会被保持。
  • SQLServer 模式:把会话状态存储到一个 SQL Server 数据库中。如果 Web 应用程序被重启并同样为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么就能够确保会话状态会被保持。
  • Custom 模式:允许你指定一个自定义的存储提供者。
  • Off 模式:禁用会话状态。

你可以通过在应用程序 Web.config 文件中为 sessionState 元素的 mode 参数指派一个 SessionStateMode 枚举值的方式来指定你所需要使用的 ASP.NET 会话状态模式。除了 InProc 和 Off 之外的模式都需要使用额外的参数(如将在本文稍后部分讨论的数据库连接字符串)。你可以通过访问 System.Web.SessionState.HttpSessionState.Mode 属性的方式来访问当前所使用的会话状态。

InProc 模式

InProc 模式是使用 SessionStateMode 枚举的 InProc 值所指定的默认的会话状态模式。InProc 模式在本地 Web 服务器的内存中存储会话状态的值和变量。同时它也是唯一能够支持 Session_OnEnd 事件的模式。更多关于 Session_OnEnd 事件的信息,请参考:[会话状态的事件]。

小心:如果你通过在应用程序的 Web.config 文件中把 processModel 元素的 webGarden 参数值设置成 true 的方式来启用 Web 花园模式,注意这时候将不能使用 InProc 会话状态模式,如果你坚持这样,那么在不同的工作者而提供的相同会话的不同请求中将会出现数据丢失的现象。

StateServer 模式

StateServer 模式在进程中存储会话状态,被称之为 ASP.NET 状态服务,并独立于 ASP.NET 工作者进程或 IIS 应用程序池。如果 Web 应用程序被重启并同时为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么通过使用这个模式就能够确保会话状态会被保持。

要使用 StateServer 模式,你必须先确认 ASP.NET 状态服务已经在已使用会话存储的服务器中被运行。在安装了 ASP.NET 和 .NET Framework 的时候,ASP.NET 状态服务会被安装成一个系统服务。ASP.NET 状态服务被安装在系统中的如下位置:

systemroot\Microsoft.NET\Framework\版本号\aspnet_state.exe

要配置 ASP.NET 应用程序来使用 StateServer 模式,就需要在应用程序的 Web.config 文件中完成如下操作:

  • 把 sessionState 元素的 mode 参数值设置为 StateServer
  • 把 stateConnectionString 参数值设置为 Tcpip=服务器名称:42424

    提示:要在使用 StateServer 模式的时候改进应用程序的安全性,建议你通过加密配置文件中的sessionState 配置段的方式来保存 stateConnectionString 的值。关于详细内容,请参考:[使用已保护的配置来加密配置信息]。

如下实例说明了一个为被存储在名为 SampleStateServer 的远程计算机中的会话状态而使用 StateServer 模式的配置设定。

<configuration>
<system.web>
<sessionState mode="StateServer"
stateConnectionString="tcpip=SampleStateServer:42424"
cookieless="false"
timeout="20"/>
</system.web>
</configuration>

提示:如果 mode 被设置成 StateServer,那么被存储在会话状态中的对象必须能够被序列化。关于序列化对象的信息,请参考:[SerializableAttribute 类]。

要在 Web 农场中使用 StateServer 模式,你必须拥有一个与为 Web 农场中所有应用程序而在 Web 配置的 machineKey元素中被指定的相同的加密关键字。关于如何创建机器关键字的信息,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[如何使用 Visual Basic .NET 来为窗体验证创建关键字]。

SQLServer 模式

SQLServer 模式在一个 SQL Server 数据库中存储会话状态。如果 Web 应用程序被重启并同时为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么通过使用这个模式就能够确保会话状态会被保持。

提示:如果 mode 被设置成 SQLServer,那么被存储在会话状态中的对象必须能够被序列化。关于序列化对象的信息,请参考:[SerializableAttribute 类]。

要使用 SQLServer 模式,你必须先确认 ASP.NET 状态数据库已经被安装在 SQL Server 中。你可以使用 Aspnet_regsql.exe 工具来安装 ASP.NET 会话状态数据库,与本文中稍后部分所描述的一样。

要配置 ASP.NET 应用程序来使用 SQLServer 模式,就需要在应用程序的 Web.config 文件中完成如下操作:

  • 把 sessionState 元素的 mode 参数值设置为 SQLServer
  • 把 sqlConnectionString 参数值设置为 SQL Server 数据库的连接字符串。

    提示:要在使用 SQLServer 模式的时候改进应用程序的安全性,建议你通过加密配置文件中的sessionState 配置段的方式来保存 sqlConnectionString 的值。关于详细内容,请参考:[使用已保护的配置来加密配置信息]。

如下实例说明了一个为被存储在名为 SampleStateServer 的远程计算机中的会话状态而使用 SQLServer 模式的配置设定。

<configuration>
<system.web>
<sessionState mode="SQLServer"
sqlConnectionString="Integrated Security=SSPI;data
source=SampleSqlServer;" />
</system.web>
</configuration>

提示:如果你在配置文件中使用 sessionState 元素的 sqlConnectionString 参数来为你的 SQL Server 指定一个被信任的连接串,那么 SessionStateModule 将会使用被集成的安全性来连接到你所指定的 SQL Server,并使用现有的 ASP.NET 进程标识或在 identity 配置元素中被提供的用户凭证来产生连接。作为选择,你还可以通过指定 <identity impersonate="true" /> 并把 sessionState 配置元素的 useHostingIdentity 参数值设置为 false 的方式来指定 IIS 所扮演的角色。更多关于 ASP.NET 进程标识的信息,请参考:[配置 ASP.NET 进程标识和 ASP.NET 角色扮演]。

要配置 Web 农场的 SQLServer 模式,就需要在每个 Web 服务器的配置文件中设置 sessionState 元素的sqlConnectionString 参数值来指向相同的 SQL Server 数据库。IIS 元数据中的 ASP.NET 应用程序路径必须与所有在 SQL Server 数据库中共享会话状态的 Web 服务器相同。关于在服务器之间出现不同的应用程序路径时的解决步骤,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[PRB:使用 SqlServer 或 StateServer 会话模式所导致 Web 农场的会话状态的丢失]。

使用 Aspnet_regsql.exe 工具来安装会话状态数据库

要在 SQL Server 中安装会话状态数据库,就需要运行位于 Web 服务器的 Systemroot\Microsoft.NET\Framework\版本号 目录中的 Aspnet_regsql.exe 工具。该工具支持如下命令行信息:

  • SQL Server 实例的名称,使用 -S 选项。
  • 一个拥有 SQL Server 数据库创建权限的用户帐号的登入凭证。使用 -E 选项来使用当前已登入的用户,或连同指定密码的 -P 选项一起使用 -U 选项来指定一个用户 ID。
  • -ssadd 命令行选项用来添加会话状态数据库。

    默认时,你不能使用 Aspnet_regsql.exe 工具在 SQL Server Express Edition 中安装会话状态数据库。要运行 Aspnet_regsql.exe 工具来安装一个 SQL Server Express Edition 的数据库,你必须先使用如下所示的 T-SQL 命令来启用 Agent XPs 选项:

    EXECUTE sp_configure 'show advanced options', 1
    RECONFIGURE WITH OVERRIDE
    GO EXECUTE sp_configure 'Agent XPs', 1
    RECONFIGURE WITH OVERRIDE
    GO EXECUTE sp_configure 'show advanced options', 0
    RECONFIGURE WITH OVERRIDE
    GO

    如果有必要,你必须在任何禁用了 Agent Xps 选项的 SQL Server Express Edition 实例中运行这些 T-SQL 命令。

默认时,Aspnet_regsql.exe 工具将创建一个名为 ASPState 并包含对 SQLServer 模式提供支持的存储过程的数据库。会话数据本身在默认的时候是被存储在 tempdb 数据库中的。你可以使用 -sstype 选项来改变会话数据的存储位置。下表说明了 -sstype 选项中的可用值:

选项 描述
t 默认值,把会话数据存储到 SQL Server 的 tempdb 数据库中。存储在 tempdb 数据库中的会话数据会在 SQL Server 被重启的时候被丢失。
p 把会话数据存储到用来替代 tempdb 数据库的 ASPState 数据库中。
c 把会话数据存储到一个自定义的数据库中。如果你指定了 c 选项,那么你还必须使用 -d 选项来包括自定义数据库的名称。

例如,如下命令在一个名为 SampleSqlServer 的 SQL Server 实例中创建了一个名为 ASPState 的数据库并指定会话状态也同样需要被存储在 ASPState 数据库中:

aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p

提示:如果你运行了 ASP.NET 1.0 或 ASP.NET 1.1,那么 Aspnet_regsql.exe 工具就不能提供选项来把会话数据存储到 ASPState 数据库中。但是,你还是能够使用脚本来把会话数据存储到一个持续保持的数据库中。关于详细内容,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[ASP.NET 实践:持续保持的 SQL Server 会话状态管理时的 ASP.NET 配置]。

使用 SQLServer 模式,你能够把几台同时运行 SQL Server 的计算机配置成为故障转移群集,即两台或更多完全相同的并且都为同一个数据库而存储数据的 SQL Server 的计算机。如果其中有一台运行 SQL Server 的计算机出现故障,那么群集中的另外一台服务器就可以在不丢失会话数据的情况下进行接管并继续为请求提供服务。要配置一个故障转移群集的 SQL Server 模式,你必须在执行 Aspnet_regsql.exe 工具把存储会话状态数据的 tempdb 数据库替换成 ASPState 数据库的时候使用 -sstype p 选项。SQL Server 群集不支持在 tempdb 数据库中存储会话状态。更多关于为故障转移群集配置 SQL Server 模式的信息,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[如何在故障转移群集中使用 ASP.NET 会话状态的 SQL Server 模式]。

Custom 模式

Custom 模式指定了你需要用来存储会话状态数据的一个自定义会话状态存储提供者。在你使用 Custom 模式来配置 ASP.NET 应用程序的时候,你必须使用 sessionState 配置元素的 providers 子元素来指定会话状态存储提供者的类型。你可以通过同时为子元素添加 type 参数(包括用来指定提供者的类型名称)和 name 参数(用来指定提供者的实例名称)的方式来指定提供者的类型。于是提供者的实例名称被提供给 sessionState 元素的 customProvider 参数并用来配置 ASP.NET 会话状态以对这个存储并获取会话数据的提供者实例进行使用。

如下实例说明了来自于一个指定 ASP.NET 会话状态使用自定义会话状态存储提供者的 Web.config 文件中的元素集:

<configuration>
<connectionStrings>
<add name="OdbcSessionServices"
connectionString="DSN=SessionState;" />
</connectionStrings> <system.web>
<sessionState
mode="Custom"
customProvider="OdbcSessionProvider">
<providers>
<add name="OdbcSessionProvider"
type="Samples.AspNet.Session.OdbcSessionStateStore"
connectionStringName="OdbcSessionServices"
writeExceptionsToEventLog="false" />
</providers>
</sessionState>
</system.web>
</configuration>

关于自定义会话状态存储提供者的更多信息,请参考:[实现会话状态存储提供者]。

提示:自定义的会话状态存储提供者能够对任何安全资源(如 SQL Server)进行访问,通过使用现有的 ASP.NET 进程标识或在identity 配置元素中被提供的用户凭证,你可以通过指定 <identity impersonate="true" /> 并把 sessionState 配置元素的 useHostingIdentity 参数值设置为 false 的方式来指定 IIS 所扮演的角色。更多关于 ASP.NET 进程标识的信息,请参考:[配置 ASP.NET 进程标识和 ASP.NET 角色扮演]。

ASP.NET 会话状态的模式的更多相关文章

  1. Azure Redis 缓存的 ASP.NET 会话状态提供程序

    Azure Redis Cache 提供了一个会话状态提供程序,你可以使用其在缓存中(而不是内存中或在 SQL Server 数据库中)存储会话状态.要使用缓存会话状态提供程序,先首先配置缓存,然后使 ...

  2. ASP.net之策略模式

    设计思路: 用ASP.net设计,调用策略模式.在第一个数和第二个数的文本框中输入数值,单击录题按钮,数值保存在n1,n2文档中,把要做的题都保存完后,单击开始按钮,开始做题,做完单击判断按钮,进行判 ...

  3. ASP.NET四则运算--工厂模式

    这次是在ASP.NET上实现四则运算,之前用策略模式实现了,所以这次想着用工厂模式实现一下. Calculator.cs using System; using System.Collections. ...

  4. ASP.NET四则运算--策略模式

    在ASP.NET中实现四则运算,同样使用了类的封装,以及策略模式.只不过是把封装的类.前台代码以及后台的代码分离开来,但同样是要达到功能的实现. Calculator.cs using System; ...

  5. asp.net mvc CodeFirst模式数据库迁移步骤

    利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了. 但是,我有新的类要加入,有字段需要修改,那怎么办呢,删库,跑路 ?  哈哈 利用数据库迁 ...

  6. Asp.Net Core Options模式的知识总结

    Options模式是Asp.Net Core中用于配置的一种模式,它利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依赖注入的方法直接使用绑定的一个POCO对象,这个POCO对象就叫做O ...

  7. 【转】asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别

    原文地址:http://blog.csdn.net/luoyeyu1989/article/details/8275866 首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BL ...

  8. ASP.NET MVC架构模式

    一.是什么? MVC,即(Model-View-Controller,模型—视图—控制器模式),和三层类似,用于表示一种软件架构模式.在这种模式下,将系统的实现分为模型Model,视图View,控制器 ...

  9. ASP.NET MVC + 工厂模式 + 三层 + 缓存

    最近将手头的项目总结整理了一下,以方便自己的学习.... 下面直接上图先介绍项目的结构图: 项目是ASP.NET MVC 4.0的应用程序,DBUtility这个类库主要是DbHelper操作数据库的 ...

随机推荐

  1. php中的curl常用例子

    1.基本请求 <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com"); ...

  2. mpich2 下运行时出现“由于目标计算机积极拒绝,无法连接”的错误

    进行mpi并行编程时候,win8下使用mpich2时候,安装目录下找到wmpiexec.exe程序打开,填入编写好的.exe程序地址并制定执行的任务数目的想要运行时候,出现错误: unable to  ...

  3. ZOJ 1003 Crashing Balloon

    #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using ...

  4. js-学习方法之3

    熟悉JavaScript每一个方法的作用 这一要求听起来似乎有点不太实际,我想这个要求对于像C#.JAVA这些大型语言来说确实是,因为这些语言类库实在太庞大了,相信没有人可以全面记住它,而且也是没有必 ...

  5. 2016 ASC 移动物联网安全高峰论坛 万物互联时代的安全与隐私

    互联网的发展已经迈入了"万物互联"时代.移动设备作为人.物连接的主要入口,让人们享受高效.便利的"互联生活"的同时,也给用户的安全和隐私带来了前所未有的挑战.正 ...

  6. HDU 4247 A Famous ICPC Team

    Problem Description Mr. B, Mr. G, Mr. M and their coach Professor S are planning their way to Warsaw ...

  7. 关于通过addClass与removeClass用jquery控制有良好兼容的CSS3样式

    hi:)好久不见~最近被jquery的animate对某些CSS3特性不兼容搞的头晕眼花,果断百度,阅读了一些高手的博客后突然发现平常很少用到的addClass和removeClass属性居然还可以这 ...

  8. PerformSelector 和 NSInvocation

  9. erlang lists模块函数使用大全

    转自:http://qqdenghaigui.iteye.com/blog/1554541 一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元 ...

  10. ***C - I love sneakers!(动态规划,分组背包)

    C - I love sneakers! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...