晨鸟科技

标题: [转]Session持久化 [打印本页]

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
( w$ ?- z3 L+ b  U1 Q7 |4 ~  T/ _; _  K5 k; E
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。# e0 `& f  c. \* S; A
    进入主题。
. m# U; y! |# y  g$ U( U5 C1 e- O7 ?
3 |! F7 q. c3 X8 Q( D, V" j" L情景一,Session ID在客户端的状态
% [/ O4 e( e5 J7 i! N! |0 }        情景一中,saved in cookies情况9 m2 p' k& o. a  }$ n$ s: k
        ID保存在client端的Cookies集合中
; W" h: r: g! J: J! n2 S: B        缺点是,如果client端的cookie被禁用,那么ID无法保存- K8 ]2 [9 R4 C9 L  O  y1 o. \+ _
        设置cookieless="false"
4 u( k( p8 f) w4 }9 ~; N: q3 m2 L& Y) e8 J. @, c
<sessionState, v1 R/ P5 Z" q+ D* p* R% Y
mode="InProc": H0 y) F! Q2 w2 m" n: i8 t
stateConnectionString="tcpip=127.0.0.1:42424"
! h# V/ z" I7 |3 m2 ysqlConnectionString="datasource=127.0.0.1;userid=sa;password="
. v, y# U" t/ |- z' Rcookieless="false", V; z* V5 J* r  Z0 l
timeout="20"/>$ c4 J% v% \8 [7 W0 U! i1 i) t
& ]8 O2 H) h" m! g! ~- }1 b$ K8 d
        情景一中,saved in url情况
6 Y6 {) e! F4 O        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.5 A; r2 ^7 a! N! ]2 [1 @3 @
        设置cookieless="true"% m% P  l! Q4 J

  T) h5 C$ V4 W4 e$ N<sessionState9 |. f9 z0 x( P* y8 }
    mode="InProc", }' O- `- n3 S% F' v% P  `2 m( o
    stateConnectionString="tcpip=127.0.0.1:42424"# \8 @$ C- T& U, r2 l
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
9 I6 M- ]" |* }4 p2 ?  q. M    cookieless="true"$ b# i7 t: T9 ~1 J
    timeout="20"/>
4 D% w: L0 F' t# z, E+ ^; G* U+ N' {5 p
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。2 S9 X- B2 \3 G$ K% z
            情景二中,saved in 进程内
& ^% g1 S8 w* f  U% c; b6 D* y            设置mode="InProc"& f1 o3 h7 U% V& o" n
            优点;保存在本机内存中,无需跨网络,访问内存速度快2 e) E% ~% j/ T- N& ?
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
/ |- X, h; U, @& ?: \/ [+ ~9 B5 ~. A
) p9 P6 `6 a, q3 ^  c$ m$ Y       <sessionState
# M& C, w$ ^9 x7 C9 v" h            mode="InProc"
/ O. v$ N- u, b' N% o  A( U          stateConnectionString="tcpip=127.0.0.1:42424"
4 K; E# B5 B% X5 Z            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="; W( z  m. t9 M: }; m# F8 S
            cookieless="false"
5 W" p' M4 r; u# [            timeout="20"/>
* Z, x. q. x' s$ J* h* [7 O$ }
* E# B1 c' N  d( X           情景二中,saved in 进程外! T" c+ \7 U. P! z
           设置mode="StateServer",启动asp.net状态服务% }3 ~# E: S8 @
           定位注册表
& K1 N2 W" C3 ~: x7 w* v+ A  G            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
' D+ }: x0 ~$ k9 N) F8 t, P           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
1 q! G! i( J+ G. R           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
: x9 |: @1 p! w- `+ J7 j9 ?2 `" X           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
% [- [0 H; |$ O" r+ a2 ^  b           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,! J- n" S1 j+ c- F
           不管你的状态保存时间设置时间有多长,一律失效,( U" R1 e# ^; W$ ]7 o3 f
           不信可以考试试,^-^。
2 x! f! H  O8 E, @5 ~, Z
5 D/ o2 ?0 o9 x/ _+ R8 T: G    <sessionState
2 L) L! k5 ^1 q! |! i        mode="StateServer"* {0 p+ V6 ~6 a: G9 }' \
        stateConnectionString="tcpip=127.0.0.1:42424"/ V: {' x  w: ~" Z, u( |5 d
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
; \+ K; J! a" N6 N; v) ?* ~        cookieless="false"
* K* D6 w% f0 z( k        timeout="20"/>4 t0 ]% d% c/ Y6 s+ ]6 r
% p; m- h' r( n
       情景二中,saved in 数据库
" W! l  K0 ^8 s2 p6 u# L7 ^( u       设置
6 Q( u  G: [3 u; C" U5 d* R       mode="SQLServer"。
9 [0 w) e& S  A2 w! |( L       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。, `" ]* Z, A# N3 H" U( d
       启动SqlServer和SqlServerAgent。
9 m8 O( C+ ], A9 i' r; V& J, v       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。& o5 y8 m( ]1 |' C5 C
       执行InstallSqlState.sql。* m1 s2 v- G( Q9 d+ U! {, e7 s/ I8 {5 e
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中! V" L8 d0 `% [. d+ d' i! e
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,% V! a/ g0 R) E; G" I( M/ i: J# s
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,5 c& A' ~/ f6 |! z* r8 v$ G
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。& {) }! J8 \$ e2 Z& ^

0 n6 f7 M! q+ n% }- E! X) [新建一个Asp.netWebSite,按F5,一切OK。
% ?9 J1 Y; n5 G' ~* j8 _效果图形 + U8 ]: j+ U8 y4 D6 g% j
两张表% H  ]# O$ f- r1 S: M1 Z
[attach]429[/attach]
  `8 l0 k% r. XASPStateTempApplications表的数据7 d6 v8 V  m8 T
[attach]430[/attach]
0 \- v1 R5 |) I0 o8 x7 [ASPStateTempSessions表的数据* L7 R& Q( q+ X6 [
[attach]428[/attach]/ y# @2 p" v- T/ ]
ASPState_Job_DeleteExpiredSessions作业! f) x- {2 V, s( B6 x3 r
[attach]431[/attach]
2 k' ^7 z- ^5 q$ x
1 G0 M# V/ U* x( B- {需要注意的地方;
/ i8 e& O/ n& o3 F& Y3 u3 o# K. H; c& Y1 s0 `( \
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。7 D$ A. v% S: X  S) O5 h
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。$ e/ A: x( [0 ]' x
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"  D" \+ ]4 R* }& F

) q* k9 c) \+ \6 ?结束# [9 \  }) T* `9 p! C
    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是
) x& w+ o/ H9 p! W/ `<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/) Powered by Discuz! X3.2