asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET中的session存储模式运用


发布日期:2020年03月31日
 
ASP.NET中的session存储模式运用

在中的Session存储方式不象asp那样单一一共提供了三种存储方式由于最近一个多人使用的web软件出现了故障用户每天早上在某一时刻出现难以登陆现象接着Session丢值出现只有重启IIS或机器这时程序恢复正常了整天都不会出现同样的问题 但是第二天依旧!这种现象持续了好几天我检查了一下日志文件高峰每秒访问人数大概人左右同时大概多人在线以后访问人数还会增加为了解决这个怪问题先从软件着手故而三种方式都应用了一番

打开nfig文件

    <sessionState

    mode=InProc

    stateConnectionString=tcpip=:

    sqlConnectionString=datasource=;Trusted_Connection=yes

    cookieless=false

    timeout=

    />

其中默认的mode是InProc类型这种模式和以前ASP模式一样就是服务器将Session信息存储在IIS进程当中当IIS关闭重起后这些进程信息都会丢失但这种模式的性能最高(具体没测看书上说)这种模式是的默认方式

由于这种模式出现了故障当时我的考虑就是由于访问量过大的原因导致Inetinfoexe进程崩溃用户难以登陆以致Session丢值出现故障我采用了另外一种Session的存储方式把Session信息存储在进程外

首先打开管理工具找到服务找到名为: State Service的服务启动它并且改成自动启动这时你可以在任务管理器中看到一个名为aspnet_stateexe的进程这就是我们保存session信息的进程

然后回到nfig文件中把Mode的值改为StateServer保存文件OK

    <sessionState

    mode=StateServer

    stateConnectionString=tcpip=:

    sqlConnectionString=datasource=;Userid=sa;password=sa

    cookieless=false

    timeout=

    />

这种模式当我们重起IIS保存的session值不会丢失另外这种方式还可以把信息保存在其他机器的进程中不过还要更改 stateConnectionString=tcpip=:IP地址改为其他机器即可

另外还采取了其他的措施比如把数据库和Web服务器分开数据库服务器不提供WEB服务Web服务器不提供数据库服务

然后把连接池扩大由于中ADONET数据访问默认连接池数量为 后来我扩大到顺便把写法加上来

Server=(local);Database=rgs;password=sa;user ID=sa;Max Pool Size =; Min Pool Size =;Pooling=True

最后把nfig中的ProcessModel中的memoryLimit改为默认为表示内存占用超过%后iis进程会自动重起接着还做写其它一些优化IIS的方法把注册表的IIS缓存加大等等

当我做完这些优化步骤后整个软件运行比较良好第二天没有发现堵塞的现象但是第三天情况又出现了实在没办法我采取了最后一种ASPNET中的session存储方法就是将Session存储在SQLServer中我想这样稳定性应该强些

要使用SQLServer中首先在会话状态的SQLServer的计算机上运行InstallSqlStatesql或InstallPersistSqlStatesql(默认位置:systemroot\MicrosoftNET\Framework\versionNumber下面)两个脚本都创建一个名为ASPState的数据库两个脚本的差别在于放置ASPStateTempApplication和ASPStageTempSessions表的位置InstallSqlStatesql脚本将这些表添加到TempDB数据库该数据库在计算机重起时将丢失数据而InstallPersistSqlStatesql脚本将这些表添加到ASPState数据库该数据库重启时保留会话数据

然后在应用程序的nfig文件中把< sessionState>元素的mode属性设置为SQLServer最后将sqlConnectionString属性设置为Integrated Security=SSPI;data source=serverName;

    <sessionStatemode=SQLServer

    sqlConnectionString=IntegratedSecurity=SSPI;datasource=dataserver;

    cookieless=false

    timeout=/>

    </sessionState>

如果部署在其他机器上可以更改为加上用户名和密码

    <sessionState

    mode=SQLServer

    stateConnectionString=tcpip=:

    sqlConnectionString=datasource=;Userid=sa;password=sa

    cookieless=false

    timeout=

    />

这样部署完成了如果不想使用这种可以删除掉只要在相应的目录(systemroot\MicrosoftNET\Framework\versionNumber)找到UninstallPersistSqlStatesql或者UninstallSqlStatesql文件运行即可这样就介绍了ASPNET中的session存储模式

最后要注意的是无论使用StateServer或者SQLServer模式时当使用session转换对象时

注意对象要先序列化就是在类前加上Serializable否则会出现错误!

上一篇:C#+ASP.NET 2.0 定制复合组件之高级篇

下一篇:ASP.NET 2.0中实现模板中的数据绑定