晨鸟科技

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

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
8 ^5 k7 U) m: K0 D+ C" A, k
& P# K  t' |; \! b+ C' w% W% [/ s关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。2 x2 u' P- V+ Y  P
    进入主题。2 ]  Q3 T" j+ K7 g

8 d* h; j4 s$ I8 |+ s2 ?情景一,Session ID在客户端的状态7 F6 g3 g. B) s7 X
        情景一中,saved in cookies情况/ ^' E/ D6 a; g& F7 x
        ID保存在client端的Cookies集合中: e6 P$ b) `" [' o" }3 A
        缺点是,如果client端的cookie被禁用,那么ID无法保存: {% O4 p2 o! A: ^
        设置cookieless="false"
; T0 C; ~' u6 @5 n2 L+ g7 o1 _; R0 R# f" m9 |' e. o% G( K/ D
<sessionState3 {2 p: e- ~! @2 J; G
mode="InProc"( D# m, p) y1 \9 `: ]
stateConnectionString="tcpip=127.0.0.1:42424"
+ R3 w! A. U/ S' X7 o0 HsqlConnectionString="datasource=127.0.0.1;userid=sa;password="7 k' [% M" Q/ Y4 y  \$ b
cookieless="false"
6 S5 o0 L% R* D4 itimeout="20"/>
& X, i2 _- t! f1 U0 d
1 ?1 B7 q* k- a$ W; Z1 e        情景一中,saved in url情况( C( j% q, ^7 |; `1 O
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.6 g0 O9 R; ~7 m0 s) G- c
        设置cookieless="true"0 g. _, n+ ]4 J( u& V
# `% P  }) ?2 D5 U2 S
<sessionState% k; a! v  g7 x5 X1 L5 j; Q2 y
    mode="InProc"# p; s; J, F5 E; |' X' a
    stateConnectionString="tcpip=127.0.0.1:42424". K: b+ {  l7 U8 J+ x1 B
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password=", N6 `0 e2 Z3 }7 n4 L. p" A
    cookieless="true"( N. I; l' n0 k3 O5 Z' c  D
    timeout="20"/>
% u. S6 R$ t$ R5 O" P1 j% n% E% k- Y" s8 b% F2 X0 _* Z4 M  q
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。9 e/ U# g; N( `; E7 g) ]5 s9 F
            情景二中,saved in 进程内4 ^7 R3 K/ S8 `* x) E! j
            设置mode="InProc"' C  t4 t- R. Y) m! }
            优点;保存在本机内存中,无需跨网络,访问内存速度快! f5 x; }) I! L  M# O* q* _
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态* R3 u% v0 P/ j% l$ y1 o! Y

. s2 s9 C9 h2 m       <sessionState7 [- v6 Y8 W) _' ]! g$ S0 d
            mode="InProc"
9 B: O& c% K' J) Z) n0 z; f- u          stateConnectionString="tcpip=127.0.0.1:42424"6 D0 _' b3 {3 w; h" e# [
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password=") T' @) f3 l1 X, w' Z1 D
            cookieless="false"
$ T; r% t0 C% x' w7 F% O: O            timeout="20"/>
, @$ o2 T8 v" C" e2 k4 P+ i- E7 C5 p) N! ^2 i1 Q
           情景二中,saved in 进程外
6 H) {/ r* _$ U( V  q, ]           设置mode="StateServer",启动asp.net状态服务' W8 L. B# h5 O+ B9 P# m/ F+ u
           定位注册表" M3 ]8 `7 ]  j* ^6 v7 j; |0 b
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424242 A) {( K# O; ?) |
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。7 t: I' ~- O7 O) w
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
3 ^/ J/ n$ @( i7 y# B$ m           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",; |7 A7 k" ^, u
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
4 I7 {3 J0 d- w- }/ x           不管你的状态保存时间设置时间有多长,一律失效,7 o1 P# z& H3 \9 t9 `( V
           不信可以考试试,^-^。. f2 r: [' R8 M% P
/ K' |" f, p# i) {
    <sessionState
' \; D9 o& V5 s; o, e/ f: v) P        mode="StateServer"/ _; R# T7 l, o# u+ O7 O
        stateConnectionString="tcpip=127.0.0.1:42424"
6 F0 z4 M1 \5 Q2 L        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="# N$ [) u* k2 V% A1 E; k
        cookieless="false"$ M- K# u4 z( J$ a  u
        timeout="20"/>
5 x7 S' [9 b8 P1 b
3 ^/ P7 J' _1 O5 `4 v       情景二中,saved in 数据库
  I& D/ e) z2 I1 w% k. L       设置: W+ F1 |2 I9 M% c
       mode="SQLServer"。
* e- H9 `0 r% h       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。4 J; a+ R, Z0 h) o+ B# A
       启动SqlServer和SqlServerAgent。
; Y* }5 x  y# \3 ~  F9 p9 X3 }' L       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
% M6 |5 l/ C* n       执行InstallSqlState.sql。* |8 ^+ c5 t7 j9 l, M5 F
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
/ L4 S6 }1 {; V+ `5 K2 M1 L       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,5 r0 \; s7 M  j( K+ U
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,8 s) J. U# L. h8 q9 l6 c9 F% W
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。7 O6 k5 A9 ?8 X* Q' P

8 F! C, g* V& e! {% t/ |; y, V新建一个Asp.netWebSite,按F5,一切OK。
9 N; I0 N* D4 Z效果图形 5 T) D8 e9 G+ t4 S. p
两张表, }6 M# k9 r) E( L
[attach]429[/attach]& {0 y/ k5 I* a" Z" h+ {3 V
ASPStateTempApplications表的数据( u+ j$ z( _* r$ ?/ B7 s( k% X
[attach]430[/attach]
" F! H6 P3 Y8 q: X- BASPStateTempSessions表的数据
9 n* ?1 \0 S8 v) O3 x2 c8 \[attach]428[/attach]
! p7 i3 L2 e2 [0 ]+ p6 ?ASPState_Job_DeleteExpiredSessions作业
7 @0 n$ y& _. i. s" A$ Q[attach]431[/attach]+ j; g/ J/ z! O% F5 \( n

, [, H- M) ?' N* r' f% d2 \( D' b需要注意的地方;
% n0 _. X- w( M6 Y3 [
4 c& x8 S; Z! V5 D1 x% _& z& b一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
! }- p: D( j: }6 H& `* g- r+ p. _二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。( P% K: R" Z; r- Z$ J8 h# h
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
+ {% U$ d5 |; Z; L
% o& {4 p; h- n7 O) m& x结束
' k/ B" p6 ]% z2 z* ?( {8 Y) v    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是; r2 B/ w( s8 m4 q
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




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