zoukankan      html  css  js  c++  java
  • 027-Session状态提供程序

    Session分三种:
    1.InProc(进程内)-默认就是这种-速度快/但内存小/易丢失
    进程外:可以在IIS或ASPNET服务意外关闭时继续保持状态,注意此时存储到session中的对象必须支持序列化:
    2.StateServer:使用aspnet_state.exe
    2.1修改配置文件:
    2.2<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424"/>
    设置是否允许远程使用,位置:C:WINDOWSMicrosoft.NETFrameworkv4.0.30319
    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters
    2.3默认端口号:42424
    2.4开启服务:我的电脑-管理-服务与应用程序-服务-ASP.NET State Service(ASP.NET 状态服务)
    3.SQLServer
    3.1新建ASPSTATE数据库使用运行Session数据库脚本:
    临时储存区:InstallSqlState.sql & UninstallSqlState.sql
    永久储存区:InstallPersistSqlState.sql & UninstallPersistSqlState.sql(需要使用SQLServerAgent服务-因为调度作业)
    注意:之后配置数据库权限麻烦的话,可以在运行完aspnet_regsql.exe后在数据库中执行你想要使用的sql脚本,就可以不配置权限了。

    aspnet_regsql.exe -S 127.0.0.1 -U sa -P woshinibaba -ssadd -sstype c -d test
    <!--配置Session存储的位置
    InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中。 这是默认值。
    StateServer 模式,此模式将会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。 这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。
    SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。 这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。
    Custom 模式,此模式允许您指定自定义存储提供程序。
    Off 模式,此模式禁用会话状态。
    -->
    <sessionState mode="InProc">
    </sessionState>

    Session丢失情况:
    1、存放 Session 的电脑重启
    2、InProc 模式:aspnet_wp.exe 或 w3wp.exe 在“任务管理器”中或其它情况下导致其进程被终止运行。
    3、InProc 模式:修改 .cs 文件后,编译了两次(只编译一次,有时不会丢失)
    4、InProc 模式:修改了 Web.config
    5、InProc 模式,Windows 2003 环境:应用程序池回收、停止后重启
    6、InProc 模式:服务器上 bin 目录里的 .dll 文件被更新

    配置Session存储在StateServer中
    StateServer 注意:存储在Session中的对象必须可序列化。
    1.开始 ASP.NET 状态服务:cmd里面命令:services.msc【ASP.NET State Service】
    2.配置webconfig
    <!--<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424">
    </sessionState>-->
    3.如果是远程的stateserver配置注册表,启动对应服务器的“允许远程连接功能”
    命令:cmd → regedit.exe HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersAllowRemoteConnection设置成1.【1表示其他计算机也能访问当前状态服务,0表示不允许。】
    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersPort,设置端口。
    存储在Session中的对象必须是可序列化的(二进制序列化)

    Session存储在SQLServer中
    //执行下面代码,自动创建数据库
    aspnet_regsql.exe -S steve-pc -U sa -P 1234 -ssadd -sstype c -d SessionTestDb
    //aspnet_regsql.exe -S steve-pc -E -ssadd -sstype c -d SessionTestDb
    1. <sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="Data Source=steve-pc;Initial Catalog=SessionTestDb;User ID=sa;Password=1234"></sessionState>
    2.对象必须可序列化
    Session有什么重大BUG,微软提出了什么方法加以解决?(常考)
    iis中由于有进程回收机制,系统繁忙的话Session会丢失,IIS重启也会造成Session丢失。这样用户就要重新登录或者重新添加购物车、验证码等放到Session中的信息。可以用State server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。但是(一定要写上,这样才够拽)我认为这不是Bug,只能说是In-Proc方式存储Session的缺陷,缺陷是和Bug不一样的,In-Proc方式存储Session会由服务器来决定什么时候释放Session,这是By Design,In-Proc方式不满足要求的话完全可以用StateServer和数据库的方式。

    StateServer还可以解决集群Session共享的问题。

    配置StateServer的方法:
    http://support.microsoft.com/kb/317604
    http://blog.csdn.net/zj1103/archive/2008/09/14/2926773.aspx

    Session的其它存储方式

    -》三种存储方式:
    InProc:进程内,默认是这种方式
    State Service:在asp.net中进行会话存储的一种方式,需要开启State Server
    SqlServer:进行数据库持久化存储
    -》要求:对象可序列化
    -》配置:参考配置文档
    -》一致性哈希算法
    数据结构(队列、栈、堆)

  • 相关阅读:
    《POJ-2369》
    《1402
    《2018 Multi-University Training Contest 8》
    《HDU
    循环串
    模拟赛 数根 题解
    备份
    关于带删除线性基
    论OIer谈恋爱的必要性
    某计数题题解
  • 原文地址:https://www.cnblogs.com/ninghongkun/p/6363716.html
Copyright © 2011-2022 走看看