ASP.NET的会话状态(二)

原创 2005年05月15日 01:25:00
四, 状态提供 (State Providers)
       默认情况下, 应用程序将会话状态存放在辅助进程 (aspnet_wp.exe) 中, 更确切地说, 它被存在 Cache 对象的私有存储槽 (slot) 当中, 且不能用编程的方法来访问, 即使你枚举ASP.NET数据缓存中的所有内容, 也
不会看到和会话状态有关的任何东西. Cache 对象有两个存储槽, 程序员仅仅允许操纵公有的存储槽.  每一个活动的会话状态占用一个私有存储槽, 存储槽以会话 ID 命名, 值是一个叫做 SessionStateItem类的对象, InProc State Provider 通过会话ID从缓存中取得相应的对象, 然后, essionStateItem对象的内容被传送到 HttpSessionState 对象中, 并可通过 Session 属性访问.
       目前为止, 就访问来说, InProc方式是最快的, 但是要雇的是, 你在会话当中存的数据越多, 服务器花费的内存也越多, 这会影响应用的性能. 如果你打算使用进程外的解决方案, 也要考虑序列化和反序列化带来的影响.
将会话状态存放在外部进程或数据库中都会存在这样的问题, 这样的操作在每一次请求被处理的时候都会发生. 使用进程外存储使得你的会话状态存活的时间更长, 并且使得应用更为健壮, 因为它不会因为IIS或辅助进程的失败而受到影响.
       如果你打算使用 State Server 方式, 你必须在应用启动前打开 ASP.NET State Service 这个系统服务,它随.NET一起安装, 但并不自动运行, 需要手动来启动驼, 它是一个叫做 aspnet_state.exe 的进程. 除此之外,
还要在 web.config 文件中配置运行该服务的主机 IP 地址及 TCP 端口号:

   <system.web>
        <sessionState
            mode="StateServer"
            stateConnectionString="tcpip=<hostname>:42424" />
    </system.web>

在 stateConnectionString 后面填入运行该进程的主机 IP, 默认为 127.0.0.1, 端口号是强制的. 这样一来,不管辅助进程发生了什么问题, 会话状态将永远在那里, 如果服务暂停, 数据会被保留, 而且在服务恢复的时候重新被取回, 但如果服务进程停止或失败了, 则数据将会丢失. 注意可以用主机名代替IP, 但只能使用合法的 ASCII 字符.
       当健壮性对于你的应用程序来说非常关键的时候,  可以使用 SQLServer 模式:
 
     <system.web>
        <sessionState
            mode="SQLServer"
            sqlConnectionString="server=127.0.0.1;uid=<user id>;pwd=<password>;" />
    </system.web>

  必须在 sqlConnectionString 中指定连接字符串, 注意地是这里必须包含用户名, 密码, 服务器名, 它不能包含   如 Database, Initial Catalog 这样的符号, 因为它们的名字默认已经被固定了, 当然用户名和密码可以改为使用
ntegrated Security, 即使用 windows 的集成安全验证. 
       那么怎样创建数据库呢? ASP.NET 使用两对脚本来配置数据库环境, 每一对是 InstallSqlState.sql 和 UninstallSqlState.sql 它们创建了一个叫 ASPSate 的数据库和一些存储过程, 并且存放在 tempDB 下面, 这是一个临时数据库, 意味着如果服务器重启, 数据将会丢失. 要取消这个限制, 可以使用第二对脚本, 它们是 InstallPersistSqlState.sql 和 UninstallPersistSqlState.sql.,这个数据库将是持久的, 在创建这个数据库的同时, 还会建立一个任务, 它用来在数据库中删除过期的会话, 它的名字叫
ASPState_Job_DeleteExpiredSessions, 会每分钟运行一次, 这个任务需要 SQLServerAgent 服务的支持.
       不管你选用哪种模式, 编程的方法是不变的, 所有的细节都在底层被处理了,  也许序列化是这几种模式之间最重要的区别.


 

无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKE...
  • sntyy
  • sntyy
  • 2008年02月13日 12:54
  • 16496

无法序列化会话状态

无法序列化会话状态无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。在StateServe...
  • lijian260
  • lijian260
  • 2010年01月21日 20:29
  • 2485

ASP.NET 中实现会话状态的基础

简介在 Web 应用程序这样的无状态环境中,了解会话状态的概念并没有实际的意义。尽管如此,有效的状态管理对于大多数 Web 应用程序来说都是一个必备的功能。Microsoft® ASP.NET 以及许...
  • likunran521
  • likunran521
  • 2011年04月11日 18:58
  • 1017

无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。

session是工作在你的应用程序进程中的。asp.net进程、iis往往会在20分钟之后重启相关的应用程序,缓冲池满了(例如100个之后)也会重启,各种进程保护措施都会随时重新启动,因此InProc...
  • byondocean
  • byondocean
  • 2012年05月14日 12:55
  • 7817

ASP.NET 会话状态--转msdn

ASP.NET 会话状态支持若干用于会话数据的存储选项。每个选项都由 SessionStateMode 枚举中的一个值标识。下面的列表描述了可用的会话状态模式: InProc 模式,此模...
  • jjjjyyyyy
  • jjjjyyyyy
  • 2007年04月18日 16:53
  • 870

ASP.NET 2.0会话状态概述

ASP.NET 2.0会话状态概述jupiter@yeah.net2008-3-12说明:本文绝大部分摘自MSDN文档,同时参考《ASP.NET与C#从入门到精通》(A.Russell Jones著)...
  • dreamliner
  • dreamliner
  • 2008年03月12日 22:17
  • 1154

ASP.NET存储状态的一个问题

通常,ASP.NET存储会话状态有三种方式——InProc、StateServer和SQLServer。一般最常用的是第一种,在这种情况下,可以用类似这样的语法来存储会话状态:Session["key...
  • loverP
  • loverP
  • 2007年01月19日 09:58
  • 11874

如何使用SQLServer Session

最近开发项目,由于涉及到Session保持的问题,最终查了一下网络上的相关
  • fwj380891124
  • fwj380891124
  • 2014年09月29日 14:50
  • 2718

asp.net 里的会话状态

今天看到 Session 的一个方法,怎么也想不起来是起什么作用了就是session.abandon() 取消当前的会话。不小心看到了关于在 Sql 里保存会话状态的介绍,以前也在网上看人家写过,今天...
  • qi_jianzhou
  • qi_jianzhou
  • 2006年01月20日 14:16
  • 1208

ASP.NET 会话状态概述(msdn)

可使用 ASP.NET 会话状态存储和检索用户的值。当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您能够存储和检索用户的值。HTTP是一种无状态协议。这意味着 We...
  • saijie1983
  • saijie1983
  • 2008年11月27日 11:17
  • 460
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET的会话状态(二)
举报原因:
原因补充:

(最多只允许输入30个字)