在asp.net中实现会话状态基础 3
点击次数:24 次 发布日期:2008-11-26 10:42:14 作者:源代码网
|
源代码网推荐 源代码网推荐 比较状态提供程序 源代码网推荐 源代码网推荐 默认情况下,ASP.NET 应用程序将会话状态存储在辅助进程的内存中,特别是 Cache 对象的专用槽中。选中 InProc 模式时,会话状态将存储在 Cache 对象内的槽中。此槽被标记为专用槽,无法通过编程方式进行访问。换句话说,如果枚举 ASP.NET 数据缓存中的所有项目,将不会返回类似于给定会话状态的任何对象。Cache 对象提供两类槽:专用槽和公用槽。编程人员可以添加和处理公用槽,但专用槽只能由系统(特别是 system.web 部件中定义的类)专用。 源代码网推荐 源代码网推荐 每个活动会话的状态都占用缓存中的一个专用槽。槽的名称根据会话 ID 进行命名,其值是名为 SessionStateItem 的内部未声明类的一个实例。InProc 状态提供程序获取会话 ID 并在缓存中检索对应的元素。然后将 SessionStateItem 对象的内容输入 HttpSessionState 词典对象,并由应用程序通过 Session 属性进行访问。请注意,ASP.NET 1.0 中存在一个错误,使 Cache 对象的专用槽可以通过编程方式进行枚举。如果您在 ASP.NET 1.0 下运行以下代码,则能够枚举与每个当前活动会话状态中包含的对象对应的项目。 源代码网推荐 源代码网推荐 foreach(DictionaryEntry elem in Cache) 源代码网推荐 { 源代码网推荐 Response.Write(elem.Key + ": " + elem.Value.ToString()); 源代码网推荐 } 源代码网推荐 源代码网推荐 此错误已经在 ASP.NET 1.1 中得到解决,当您枚举缓存的内容时,将不再列出任何系统槽。 源代码网推荐 源代码网推荐 到目前为止,InProc 可能是最快的访问选项。但请记住,会话中存储的数据越多,Web 服务器所消耗的内存就越多,这样会潜在地增加性能降低的风险。如果您计划使用任何进程外解决方案,应该认真考虑一下序列化和反序列化可能带来的影响。进程外解决方案使用 Windows NT 服务 (aspnet_state.exe) 或 SQL Server 表来存储会话值。因此,会话状态保留在 ASP.NET 辅助进程之外,并且需要使用额外的代码层,在会话状态和实际的存储介质之间进行序列化和反序列化操作。只要处理请求就会发生此操作,而且随后必须对其进行最高程度的优化。 源代码网推荐 源代码网推荐 因为需要将会话数据从外部储备库复制到本地会话词典中,所以请求导致性能下降了 15%(进程外)到 25% (SQL Server)。请注意,虽然这只是一种粗略的估计,但它应该接近于最低程度的影响,最高程度的影响将远高于此。实际上,这种估计并没有完全考虑到会话状态中实际保存的类型的复杂程度。 源代码网推荐 源代码网推荐 在进程外存储方案中,会话状态存活的时间较长,使应用程序的功能更强大,因为它可以防止 Microsoft? Internet 信息服务 (IIS) 和 ASP.NET 失败。通过将会话状态与应用程序相分离,您还可以更容易地将现有应用程序扩展到 Web Farm 和 Web Garden 体系结构中。另外,会话状态存储在外部进程中,从根本上消除了由于进程循环而导致的周期性数据丢失的风险。 源代码网推荐 源代码网推荐 下面介绍如何使用 Windows NT 服务。正如上文所述,NT 服务是一个名为 aspnet_state.exe 的进程,通常位于 C:WINNTMicrosoft.NETFrameworkv1.1.4322 文件夹中。 源代码网推荐 源代码网推荐 实际目录取决于您实际运行的 Microsoft? .NET Framework 版本。使用状态服务器之前,应确保该服务就绪并正运行在用作会话存储设备的本地或远程计算机上。状态服务是 ASP.NET 的组成部分并与之一起安装,因此您无需运行其他安装程序。默认情况下,状态服务并没有运行,需要手动启动。ASP.NET 应用程序将在加载状态服务器之后立即尝试与之建立连接。因此,该服务必须准备就绪且正在运行,否则将引发 HTTP 异常。下图显示了该服务的属性对话框。 源代码网推荐 源代码网推荐 源代码网推荐 图 2:ASP.NET 状态服务器的属性对话框 源代码网推荐 源代码网推荐 ASP.NET 应用程序需要指定会话状态服务所在的计算机的 TCP/IP 地址。必须将以下设置输入该应用程序的 web.config 文件中。 源代码网推荐 源代码网推荐 <configuration>; 源代码网推荐 <system.web>; 源代码网推荐 <sessionState 源代码网推荐 mode="StateServer" 源代码网推荐 stateConnectionString="tcpip=expoware:42424" />; 源代码网推荐 </system.web>; 源代码网推荐 </configuration>; 源代码网推荐 源代码网推荐 stateConnectionString 特性包含计算机的 IP 地址以及用来进行数据交换的端口。默认的计算机地址为 127.0.0.1(本地主机),默认端口为 42424。您也可以按名称指示计算机。对于代码来说,使用本地或远程计算机是完全透明的。请注意,不能在该名称中使用非 ASCII 字符,并且端口号是强制的。 源代码网推荐 源代码网推荐 如果您使用进程外会话存储,会话状态将仍然存在并且可供将来使用,无论 ASP.NET 辅助进程出现何种情况。如果该服务被中断,数据将被保留下来,并且在该服务恢复时自动进行检索。但是,如果状态提供程序服务停止或失败,数据将丢失。如果您希望应用程序具有强大的功能,请使用 SQLServer 模式,而不要使用 StateServer 模式。 源代码网推荐 源代码网推荐 <configuration>; 源代码网推荐 <system.web>; 源代码网推荐 <sessionState 源代码网推荐 mode="SQLServer" 源代码网推荐 sqlConnectionString="server=127.0.0.1;uid=<user id>;;pwd=<password>;;" />; 源代码网推荐 </system.web>; 源代码网推荐 </configuration>; 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
