晨鸟科技

 找回密码
 注册
搜索
查看: 11361|回复: 3
打印 上一主题 下一主题

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 4 N* K% l3 E9 P+ x( d# `* j

0 G' ^" f* L  `1 f% c- x9 C6 r+ `关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
/ c! u9 `$ _# C5 G% t/ [    进入主题。
) t4 `' Q4 g* N5 Z7 n
- o. u1 |% y; X2 I  Y! w; Q情景一,Session ID在客户端的状态, K+ o( b6 n- f3 W& q/ W
        情景一中,saved in cookies情况& x6 E8 X$ ^4 P) f
        ID保存在client端的Cookies集合中5 ]3 r* j1 z8 y* h
        缺点是,如果client端的cookie被禁用,那么ID无法保存. D- n: l0 u9 n( s, r
        设置cookieless="false"
7 ^& V; m: ~! }3 G0 J; l- h0 R" a# c9 N# ^
<sessionState
, S7 {. [. J" O7 g+ K2 Lmode="InProc", N( J4 \) v- W
stateConnectionString="tcpip=127.0.0.1:42424"+ z6 ~  a% `% R& ]/ P
sqlConnectionString="datasource=127.0.0.1;userid=sa;password=": x6 n9 A' a! J, u
cookieless="false". q2 V" n8 N# [
timeout="20"/>
6 a8 ?' I8 L. R9 j; N9 c9 h3 [/ ^8 x* C1 m, M7 q
        情景一中,saved in url情况
$ \  ?, [. X+ {; ~7 x        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.0 M. d. e/ X% I/ @, D4 v
        设置cookieless="true". G% a  C: H1 m' p9 B8 ^
7 g4 O" ^2 H, ]! v* l
<sessionState
0 a; ^# X: ~5 q) M    mode="InProc"  d7 c- k( D( h/ l9 y6 S
    stateConnectionString="tcpip=127.0.0.1:42424"
7 f' b  n/ `1 a" W- e1 P- \    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="8 M& o) D( C; k' E
    cookieless="true"
4 `: J) |9 L, B% }  w    timeout="20"/>
) P" z2 h2 {+ D4 I. C3 r, H( h7 c' L8 T1 o# e' i8 U
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。' f7 A+ j( X3 [4 `$ p
            情景二中,saved in 进程内( r: }* C9 c" f: m1 b
            设置mode="InProc"4 w" n4 v% W8 g
            优点;保存在本机内存中,无需跨网络,访问内存速度快, Y2 K: l% \) C4 }2 c
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
( b) e9 {% m$ [( l& M3 q6 f. A% W5 z. s4 {5 D- z. ?: h3 n5 L
       <sessionState
5 ~2 Y2 P/ {/ i+ B; w% p            mode="InProc"6 ]4 `1 o/ v8 o! n9 k: E
          stateConnectionString="tcpip=127.0.0.1:42424"$ V; I, a6 O+ B5 z+ j! e1 ?' s
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="5 f& d8 f9 Y9 ~6 C: S( P+ f  }
            cookieless="false"# M2 a, R$ |* ^8 }' i* M
            timeout="20"/>& o( K$ @5 O0 q1 R" F
1 ^* t( y7 R) A) K8 P
           情景二中,saved in 进程外
/ p7 E& z6 t  B/ }3 H           设置mode="StateServer",启动asp.net状态服务
* f" c) P: F9 d& y' c- s/ K           定位注册表
' o" e9 y- a) s' g" f            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424249 L6 z* X  ~+ e( A
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
/ f8 b! b- ]' [9 n           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。6 T) v( J/ }$ k% o
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
3 M" S' X9 Y: M* W2 q% R           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,1 _0 v, _- e( U0 P7 l
           不管你的状态保存时间设置时间有多长,一律失效,
2 t) h& S: V1 o% ]           不信可以考试试,^-^。
* s; g  r$ O8 z! R; ~! \
3 w3 [; W! I8 z. q    <sessionState
( \" l4 s% I2 A, Q% t9 F+ E9 k        mode="StateServer"- p( c6 X5 ~' ~( q% j
        stateConnectionString="tcpip=127.0.0.1:42424"% z7 g" F& L9 [/ I7 H! W
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="8 Z. e. c8 p5 H+ _" ]: \* B
        cookieless="false"
7 I6 D/ E9 {) v" ?$ `, Y        timeout="20"/>7 T- k3 c9 m3 I( S, H- ?; R. y- T/ X

: p  E2 _" v; j$ `# d& G) \( C       情景二中,saved in 数据库
" X: V! D2 l) c6 @( s9 o       设置
" Y* X+ b. G2 y% h. S       mode="SQLServer"。& N/ s! {8 y/ L% U2 e5 J0 S: g+ k
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。7 A) D+ W0 p8 H7 j
       启动SqlServer和SqlServerAgent。) d) F; @+ D3 v+ Z
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。" a3 V$ H: j8 x4 d' V6 x7 }; A
       执行InstallSqlState.sql。! ]4 W  J# z' u* j2 _& Y, L4 [
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
' U) S! m, ^9 ]       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,/ Z4 ~" z. O6 D* p$ a$ F
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
6 `- Q7 A$ U+ R, I  F4 T       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。" h, s. J% ~( g7 H0 ^

( g$ l  B& O* t' s6 v  I$ U6 B新建一个Asp.netWebSite,按F5,一切OK。
  z, r& V" a7 M) S" Y, @效果图形
8 j$ n6 u( ?% i- e  E! @两张表- B& k/ Q  c; w$ I7 {) b! b3 B" A
6 I: G* l- ?. |- g
ASPStateTempApplications表的数据2 O+ F; k6 R4 j! G( M
: x* `3 n/ t4 }+ c
ASPStateTempSessions表的数据
4 Y/ j! X5 Z3 P0 G: F1 J0 d2 K( M) F( \( q
ASPState_Job_DeleteExpiredSessions作业. z& L* o5 Z( R, N) t& J3 ?
" ?" Y& w7 k' }& Q: ?3 S4 d. M
  o/ Q' `! O4 e$ }( L
需要注意的地方;' R9 F5 F+ D5 l) ]+ R

: |: z# `, G. f, n+ O# L- y5 r一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
" c% o, B+ C9 J3 W二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。. ]9 D$ I/ [# p; e# S( i/ G. |
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd") [% ~% Y$ K! A6 P7 n# D
) z- I+ |- e6 l" E, e
结束# v% k& R0 \3 D! N
    写得不妥之处,请多多指教!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是' I' L# w- U$ X8 B1 i
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|晨鸟科技 ( 沪ICP备09012675号 )

GMT+8, 2025-12-12 18:19 , Processed in 6.065663 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表