一尘

修心 暖家 济友 哄崽-专注于 移动交互设 计,J2me,Android,Iphone,WindowsMobile移动方案开发...

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  315 Posts :: 0 Stories :: 1709 Comments :: 46 Trackbacks

公告


昵称:一尘
园龄:4年
粉丝:40
关注:4

积分与排名

  • 积分 - 327314
  • 排名 - 215

最新评论

      Session持久化

    关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
    
进入主题。

情景一,Session ID在客户端的状态
        
情景一中,saved in cookies
情况
        
ID保存在client端的Cookies集合中
        缺点是,如果client端的cookie被禁用,那么ID无法保存
        
设置cookieless="false"

<sessionState
mode=
"InProc"
stateConnectionString=
"tcpip=127.0.0.1:42424"
sqlConnectionString=
"datasource=127.0.0.1;userid=sa;password="
cookieless=
"false"
timeout="20"/>

        情景一中,saved in url情况
        
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
        
设置cookieless="true"

<sessionState
    
mode="InProc"
    
stateConnectionString="tcpip=127.0.0.1:42424"
    
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
    
cookieless="true"
    
timeout="20"/>

       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
            
情景二中,saved in 进程内
            
设置mode="InProc"
            
优点;保存在本机内存中,无需跨网络,访问内存速度快
            
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态

       <sessionState
            
mode="InProc"
          
stateConnectionString="tcpip=127.0.0.1:42424"
            
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
            
cookieless="false"
            
timeout="20"/>

           情景二中,saved in 进程外
           
设置mode="StateServer",启动asp.net状态服务
           
定位注册表
            
HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1Port=42424
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
           
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
           
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
           不管你的状态保存时间设置时间有多长,一律失效
           不信可以考试试,^-^

    <sessionState
        
mode="StateServer"
    
    stateConnectionString="tcpip=127.0.0.1:42424"
        
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
        cookieless="false"
    
    timeout="20"/>

       情景二中,saved in 数据库
       
设置
       
mode="SQLServer"
       
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
       
启动SqlServerSqlServerAgent
       
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\
       
执行InstallSqlState.sql
       
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplicationsASPStateTempApplications表中
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的
ID(通过哈希算法生成的)和应用程序名称,
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
       发现也多了一个叫做
ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。

新建一个Asp.netWebSite,F5,一切OK
效果图形 
两张表
 
ASPStateTempApplications表的数据

ASPStateTempSessions表的数据

ASPState_Job_DeleteExpiredSessions作业


需要注意的地方;

一,ASPStateTempApplicationsASPStateTempSessions表的权限用户是sa,既管理员。
二,启动MsSqlSeverAgent用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions
三,如果MsSqlServerWebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"

结束
    写得不妥之处,请多多指教!

posted on 2008-01-29 15:22 一尘 阅读(5420) 评论(15) 编辑 收藏

Feedback

#1楼2008-01-29 16:18我们      
不错,很实际,很有用!
 回复 引用 查看   
session进程外存储自定义类时,需要保证类能被序列化
 回复 引用   
#3楼[楼主]2008-01-29 16:32wmj      
@dogvane
对,2楼说的好
session进程外存储自定义类时,需要保证类能被序列化
但是,如果是原始类型 就不需要了,哈哈
 回复 引用 查看   
#4楼2008-01-29 16:52Ariel Y.      
StateServer模式就是StateServer模式,叫进程外不太妥当,SQL Server还可以叫进程外呢。

SQLServer模式需要设置Mode为SQLServer,设置为StateServer是不对的。

另外还有第四种模式叫Custom,可以自己实现,请参考MSDN。

很多知识MSDN上写得那么清楚,大家为什么不多读读呢。

BTW, 没有特别针对楼主的意思,共勉。
 回复 引用 查看   
#5楼[楼主]2008-01-29 17:03wmj      
@Ariel Y.
SORRY,写快了,笔误
Custom模式没有听说过,准备研究研究

 回复 引用 查看   
#6楼2008-01-29 21:22晴天有雨      
另外提醒一点,除了InProc外,StateServer和SqlServer模式都要求session中放置的对象是可xml序列化的。

如果自定义了一个类型,并没有使其可序列化,在使用StateServer或SqlServer时就会出错。而InProc就没事。

至于平常使用的简单类型,都是可序列化的,可以放心使用。
 回复 引用 查看   
#7楼2008-01-30 07:52BlackCat      
mark
 回复 引用 查看   
#8楼2008-01-30 08:50巫云      
不错呢,支持。
 回复 引用 查看   
#9楼2008-01-30 09:13Rick Meta      
不错,收了
 回复 引用 查看   
#10楼2008-01-30 11:23周银辉      
很好,很强大
 回复 引用 查看   
#11楼[楼主]2008-01-30 14:52wmj      
@#1楼
@#2楼
@#3楼
@#4楼
@#5楼
@#6楼
@#7楼
@#8楼
@#9楼
@#10楼
谢谢你们的指导

可以在自定义类型加上[Serializable]特性
由于CLR的序列化不是一两句话就可以讲清楚,以后抽时间再补上
 回复 引用 查看   
#12楼2008-07-11 15:10大李      
总结不错,写的很实用。
 回复 引用 查看   
#13楼2009-08-03 19:51夜色狼      
不错,俺收了
 回复 引用 查看   
#14楼2009-08-03 20:13夜色狼      
<sessionState
mode="SQLServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="server=.\SQLEXPRESS;uid=sa;pwd="
cookieless="false"
timeout="20"/>
SQL2005这样才行
 回复 引用 查看   
#15楼2010-03-31 14:56岳来      
引用夜色狼:不错,俺收了

 回复 引用 查看