bcdliang的专栏

海阔天空--I Believe I Can Fly

ASP.NET的会话状态(二)

四, 状态提供 (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
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭