晨鸟科技

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

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑 7 J9 ?/ n+ p/ z' U6 o

; H5 l1 E# ]; J# X  d3 J9 g关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
5 K' G4 g. \0 ^) C( Z7 X    进入主题。$ q& L$ J: G5 o+ U5 L: d" d9 z

7 \/ M( _" ?: g7 e情景一,Session ID在客户端的状态
/ R) ?: o2 U1 F0 v        情景一中,saved in cookies情况
2 e( F/ R. [0 d! O$ t+ ^        ID保存在client端的Cookies集合中
  `* T$ w! |- H        缺点是,如果client端的cookie被禁用,那么ID无法保存" r0 b: a# p; a8 w: y9 ~% s" U6 D
        设置cookieless="false"
; V' I7 z8 Q7 Q$ G# }0 p9 e4 z( ?- o
<sessionState
/ T4 f  d2 M: f) Rmode="InProc"
( u* j8 S, h3 n6 K7 d; LstateConnectionString="tcpip=127.0.0.1:42424"5 P! _0 X5 [: N" Q# \
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="+ l7 R2 E. R( }5 D8 P4 m
cookieless="false"
) k% V, o( O4 K3 A, ntimeout="20"/>5 h! @9 _- q0 m/ ?8 Y# Q+ o

/ M8 Q5 w- f$ L6 ]$ \1 m        情景一中,saved in url情况; f( B- z6 t  k* Z. b! g/ ~# j" J" F. p
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.' h; I1 j/ G; J! K  \( ^4 y
        设置cookieless="true"3 j: O- {" x; S: n1 P1 i! T

  ?5 H1 V$ q4 B) D<sessionState
- t& y# [; t4 m, B    mode="InProc"' F, }4 c( N. C/ \, _
    stateConnectionString="tcpip=127.0.0.1:42424"
. D/ V) M( K7 c    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
- o9 `# y  D5 [* J/ f% v0 W    cookieless="true"
* n' ?. @  G" \    timeout="20"/>7 z! Z- k7 o3 D$ j/ b4 u) p. b7 E' Y
" E2 W1 F- D' o+ m; J2 H* e
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
* @6 W$ C) }7 c' r0 L/ I            情景二中,saved in 进程内) K2 l4 t8 v0 Q/ s6 z) h; G4 f' ~+ |
            设置mode="InProc"$ w* g7 C6 f/ M( n) r6 z% Y
            优点;保存在本机内存中,无需跨网络,访问内存速度快% x/ G& {: }4 E; E2 f
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态1 p8 M4 D" ~" L. p- `9 O

) d* H7 }$ x; I& A7 _1 L3 \9 S$ i( x       <sessionState
6 V0 Y9 k$ N, Q            mode="InProc"! c* k; i, V. ~3 ?% o/ f
          stateConnectionString="tcpip=127.0.0.1:42424"! o" N8 \& \9 ]7 q6 ^% V8 i3 u+ Q
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
/ ]7 L: Q  X. N3 P" Y6 b            cookieless="false"; j/ e% c" v7 c5 K0 o/ D; {' R
            timeout="20"/>
) |. ^% J3 f2 n; H% L4 o9 J! Y! Y. c% @
           情景二中,saved in 进程外. m1 H; L, r* K
           设置mode="StateServer",启动asp.net状态服务7 x! ?9 b3 `2 p' F$ v0 R& q
           定位注册表9 Q' @; H4 O, v3 F+ r+ @1 [% N
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424240 D+ [6 X" L  Y# ?7 K
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。. J6 c0 a. N0 [; t( d* J  ~
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
/ V0 A- y& b5 d  ?3 t/ h+ F* j           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",6 E/ G/ Z1 ?0 B+ N+ O  A
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,  i& k7 b; D: N2 K9 {
           不管你的状态保存时间设置时间有多长,一律失效,
6 L# y$ ]0 t6 X3 b3 Y           不信可以考试试,^-^。
3 P/ T3 W1 M/ ]' s6 p! ]' |% N) b+ ?4 q( B; |
    <sessionState
1 z" F" a4 k% R# O        mode="StateServer"* W8 x6 G3 [5 D; n: Z
        stateConnectionString="tcpip=127.0.0.1:42424"
7 [' I, I* o& N        sqlConnectionString="datasource=127.0.0.1;userid=sa;password=". I' C  _# S7 J( D# P4 j& }5 u
        cookieless="false"
, `5 L7 r! V9 ?        timeout="20"/>9 ~1 B. a) Y! r3 l, d

8 Y- B% l8 B* j, Y: t  P/ P       情景二中,saved in 数据库
" Z9 t; T" h8 Q4 b; A9 L       设置; P3 N+ k7 O5 U' g) f1 d- g
       mode="SQLServer"。% Z2 s! J4 f0 c0 ?# f
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
) g! m1 J# E/ j7 P. R# X       启动SqlServer和SqlServerAgent。. j2 n, F4 @, R- I5 c  z: z
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
4 z3 A* _) X& H! b" P% f       执行InstallSqlState.sql。
& d8 g0 Y5 R; k9 M# F+ a       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
  P3 Q3 ]& |) m0 T6 ]       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,0 Q/ j. f0 }+ X- e  f
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
6 @$ w0 l( p$ y* J( t. W* L       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。3 G! Y; x7 ?. b5 B* n
1 t7 {/ }& z3 N9 s1 e9 R- H
新建一个Asp.netWebSite,按F5,一切OK。1 Q1 ]2 T! r' i" u9 ~; |
效果图形
/ q: S9 n+ Q# {+ r# T) b9 j  s7 ]. J两张表
/ w9 Q7 C7 U9 E" A+ d [attach]429[/attach]+ |, M% B9 y6 j- g6 n
ASPStateTempApplications表的数据
) s* x" a+ a% T[attach]430[/attach]% V& Z! M+ X1 ~4 b9 _. V
ASPStateTempSessions表的数据' r! t( H/ j3 W/ `/ O6 [
[attach]428[/attach]) Q* Y5 U7 G) R9 {- V
ASPState_Job_DeleteExpiredSessions作业
0 N) E  |4 }; H  |[attach]431[/attach]  h+ E0 k% M% A2 v1 a
# }! G7 j+ h6 \% ?
需要注意的地方;
4 i% U$ K& s; h( ?. U1 |, l1 V8 Z
9 H) |5 ~  z; b. N7 ?一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
( i$ F$ O! [  H二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。7 Y4 n$ l+ R+ Z/ e
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
+ x) S; N  X: s6 T1 x* e' k! o2 j( q* @9 S+ i
结束6 q& P/ b  M3 ]3 B
    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是; K7 Z% y% f  a+ W5 u# h. p  [- q
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




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