分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程NET专区 → 文章内容

在asp.net中实现会话状态基础 3

  • 作者:佚名    来源:不详    发布时间:2007-6-30 10:20:33
  • 字体大小:
     如果页面请求设置一个读取器锁定,同一会话中同时处理的其他请求将无法更新会话状态,但是至少可以进行读取。也就是说,如果当前正在处理会话的只读请求,那么等候的只读请求要比需要完全访问权限的请求具有更高的优先权。如果页面请求为会话状态设置一个写入器锁定,那么所有其他页面都将被阻止,无论它们是否要读取或写入内容。例如,如果同时有两个框架试图在 Session 中写入内容,一个框架必须等到另一个框架完成后才能写入。


  
    比较状态提供程序
  
    默认情况下,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:\WINNT\Microsoft.NET\Framework\v1.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>;