每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式
一、ASP.Net session存储方式
1、InProc模式(进程内模式) 。为默认设置。
会话状态存储在Web服务器上的内存中。
2、StateServer模式(状态服务器模式)。
会话状态存储在一个名为ASP.Net状态服务的单独进程中。这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网路场中的多个Web服务器。
3、SQL Server模式。
会话状态存储到一个SQL Server数据库中。这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网路场中的多个Web服务器。
4、Custom模式
此模式允许您指定自定义存储提供程序。
5、Off模式
此模式禁止会话状态。
二、使用StateServer存储session
如果网站做了负载均衡,对于session存储就只能选择2、3、4了,下面先来介绍一下StateServer模式,首先得开启状态服务
然后再对web站点的“会话状态”进行设置
启用本机的状态服务
会自动在web.config里生成配置文件(如果不能生成就手动添加)
<sessionState mode=”StateServer” stateConnectionString=”tcpip=loopback:42424″ timeout=”20″ />
但是这里就存在一个问题,如果每台服务器都照上面配置,各服务器的Session都存储在本机的StateServer里面,还是没有启动共享的作用,这里就需要让一台StateServer共享出来让其他服务器访问,并将Session存储到上面,运行regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)
也可以修改StateServer的端口
接下来将其它服务器中web.config的配置文件进行修改(sessionState指向开启了允许远程访问的StateServer)
<sessionState mode=”StateServer” stateConnectionString=”tcpip=10.16.5.30:22222″ timeout=”20″ />
用StateServer这种共享式的session存储方式不仅有安全隐患,而且像上面那台共享的StateServer只要重启服务器,所有的session都会丢失,所以这种session存储方式不是很完美,用StateServer存储sesssion比较适合单机IIS开启多进程的。
三、使用SQL server存储session
要做保证安全并且不会因为重启服务器导致session丢失,那就要用sql server来存储session,ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的系统根目录Microsoft.NETFramework版本号文件夹中
cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 aspnet_regsql.exe -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password> aspnet_regsql.exe -ssadd -sstype c -d ASPState -S 10.16.5.36 -U sa -P HAha789
注:<Database Name>为数据库名为ASPState ,<SQL Server IP>为数据库实例名像 IBM-PC\SQLEXPRESS (若数据库不是2005的不要写ip地址,否则会连接失败),<User Name>为sa(或与sa同等权限的),<Password> 为 sa用户名的密码会话定义成功,但是会提示在web应用中进行相应的配置,此时查看SQLServer会发现增加了数据库ASPState,但是没有表。
在命令行下运行如下命令:aspnet_regsql.exe -ssadd -sstype p -S <SQL Server IP> -U <User Name> -P <Password>
aspnet_regsql.exe -ssadd -sstype p -S 10.16.5.36 -U sa -P HAha789
该命令对此应用进行了持久化操作。这时会看到ASPState数据库里面多了两张表,ASPStateTempSession就可以用来保存Session,接下来要对web站点的“会话状态”进行设置