会话共享解决方案—(负载均衡)


摘要:
下文讲述在c#开发中,如何部署session,使其可以在不同的web服务器中共享,具体方法如下所示:

在使用Session对象的c# web程序中,我们需在页面上使用@page指令的EnableSessionState属性为True或Readonly,
并且在Web.config文件中正确设置了SessionState属性,页面才可以使用session。
c#中Sessions的状态保留方式,取决于web.config文件中sessionstate的配置属性,
该属性有四种可能的值:Off,Inproc,StateServer和SQlServer。
off:设置禁用会话。
Inproc是默认设置。该模式与之前的ASP会话状态相似。会话的状态存储在ASP.NET进程中。其优点是显而易见的:性能。进程中的数据访问自然比夸大的进程更快。但是,此方法的状态Session取决于ASP.NET进程。当IIS进程正常崩溃或重新启动时,进程中保存的状态将丢失。
为了克服Inproc模型的缺点,ASP.NET提供了两种维护会话状态进程外的方法。
ASP.NET首先提供了Windows服务:ASPState。服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,以使用此Windows服务提供的状态管理方法。
除了在web.config文件中将mode属性设置为StateServer之外,还必须设置运行StateServer的服务器的IP地址和端口号。
1,如果您在IIS所在的机器上运行StateServer,则IP地址为127.0.0.1,端口号通常为42424.配置如下:
mode=”StateServer”
stateConnectionString = “TCPIP = 127.0.0.1:42424”
2,找一台服务器作为会话服务器(如IP:10.15.162.188),在Windows启动它的ASP.NET State Service(默认端口号为42424),将启动类型改为自动;
3.修改Session Server注册表中HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ aspnet_state \ Parameters中的AllowRemoteConnection项的值。端口键控制ASP.NET状态服务的侦听端口;您需要重新启动ASP.NET状态服务生效;
4,每个服务器的web.config stateConnectionString指向这个服务器。
使用此模型,会话状态的存储将不依赖于IIS进程的失败或重新启动,并且会话状态将存储在StateServer进程的内存空间中。
另一个会话状态模式是SQL Server模式。该模式将会话的状态保存在SQL Server数据库中。在使用此模式之前,您必须至少拥有一台SQL Server服务器,并在服务器中创建所需的表和存储过程。 .NET SDK提供了两个脚本来简化此任务:InstallSqlState.sql和UnInstallSqlState.sql。这两个文件存储在以下路径中:
系统驱动器\WINNT \ Microsoft.NET \ Framework \ version \
要配置SQL Server服务器,可以从命令行运行由SQL Server提供的命令行工具osql.exe
 osql -s [server name] -u [user] -p [password]
  例如:
 osql -s (local) -u as -p “”-i InstallSqlState.sql
完成必要的数据库准备后,将web.config文件中sessionstate元素的mode属性更改为“sqlserver”并指定SQL连接字符串。
如下所示:
mode= “SQLServer”
sqlConnectionString =“data source = 127.0.0.1; userid = sa; password =sa; Trusted_Connection = yes”
使用SQL Server模式可以使Session的状态独立于IIS服务器。您还可以使用SQL Server群集使状态存储独立于单个SQL Server。这可以为应用提供很高的可靠性。