晨鸟科技

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

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑 : y8 }5 p- g) ^$ e8 N' p/ o: H
! B4 k* E* J, F- e0 ^) s
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
7 q& f1 N* c& r: Q% K    进入主题。2 L3 A$ t1 s. p3 f8 ~
( p4 x. C2 x8 E* [( k, \" n3 ^5 d
情景一,Session ID在客户端的状态
* v. |  W. g; P. Q' l4 E+ g        情景一中,saved in cookies情况3 i+ {+ Y4 K* Q" I# G8 R
        ID保存在client端的Cookies集合中) L2 E! C5 U! i" Z, ^+ K
        缺点是,如果client端的cookie被禁用,那么ID无法保存
. S' ^' P$ I- S. ^7 ]        设置cookieless="false"- G: X8 G8 z+ H+ @; k- G0 r

$ P# \! _4 [6 l* g3 o& {<sessionState
8 p2 v6 z1 c$ p0 kmode="InProc") _# ]) t+ `; U1 B
stateConnectionString="tcpip=127.0.0.1:42424"
* C; ^  z! d! Q" q; e7 ?sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
. u8 N* u9 u1 L1 F4 scookieless="false": W* w; w/ M2 r! J7 E* O- Z
timeout="20"/>: b1 {5 y- s0 z! G, ^
9 K" [+ Y5 T4 r  e1 o, ^; l
        情景一中,saved in url情况
+ }3 U- y, K- d$ q+ L1 h        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.+ X: e  Z; O) s0 _, c8 d' Q
        设置cookieless="true"
( Z/ z9 @7 y" U
: l% T  L* }4 A( U# W  l<sessionState
' i8 R* X( Y. B; H) E: f1 g    mode="InProc"/ o, j5 R$ ~- r4 _
    stateConnectionString="tcpip=127.0.0.1:42424"
7 z% s: B3 z: R1 O# S# n    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="6 u; L  T: P: E8 [
    cookieless="true"
5 V) F+ V- B1 r    timeout="20"/>; Z5 v5 ~) ~/ V" H$ e
/ @: t* }, L. V- a
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。" @, t9 {( O/ P
            情景二中,saved in 进程内" Y# ~0 X: \0 R: x  x( o
            设置mode="InProc"& W  A8 }8 s& D# B  `
            优点;保存在本机内存中,无需跨网络,访问内存速度快
* a7 x, r& g' ]& N% w            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态7 g9 L6 }' y5 V( J/ G

# B* H9 l* c0 P  _5 r. t       <sessionState
: _" F7 B/ m  j            mode="InProc"! ]# j+ S" j5 p1 ?" {
          stateConnectionString="tcpip=127.0.0.1:42424"8 c. {9 B$ N4 ]4 P' p$ e; D
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="6 p7 i7 M2 o4 V4 y1 B. y4 k2 V
            cookieless="false"7 I+ U( r0 }0 |7 Q* ?; B6 {
            timeout="20"/>* c$ H  z' h7 H3 a

  }* {- n8 ]# {' d3 m% I           情景二中,saved in 进程外% b7 s8 X" i9 [$ f  V4 j/ ^2 o
           设置mode="StateServer",启动asp.net状态服务$ i( i" M" l8 S9 o' \: O: i: L6 r
           定位注册表+ J' E: I1 g' C
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
/ W+ w4 m, {& W. o( D7 k# d9 N           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
% Q# m: [# \, }           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
5 s3 X) g7 Z( n/ `' L* b           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
4 K; |5 U9 p8 j/ L+ o           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
& e! \) K6 j8 ~+ m2 W& }/ Q0 j; K           不管你的状态保存时间设置时间有多长,一律失效,
# I( R* r7 _8 Y9 G! Z           不信可以考试试,^-^。
5 [  E2 m* }, V8 q2 n0 I+ ^
/ r" b7 Y% m6 f4 U  \    <sessionState2 K( \7 L5 q' ^! c& n
        mode="StateServer"
4 v/ v( B+ i2 `( B" X. ~4 t        stateConnectionString="tcpip=127.0.0.1:42424", z& A& v5 j7 S( P6 ^, h0 m3 Z$ B2 ]
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
1 V0 s9 {' O8 a' K2 j% H; F5 {        cookieless="false"
& T& [$ m3 V4 `' G: f        timeout="20"/>, @0 O$ p; F) n0 K- B7 V% m3 t9 B8 Q( I

: k4 Q; b2 p" D; J$ u; }       情景二中,saved in 数据库
; e3 W2 O6 t3 \' |+ i1 K  n       设置
1 V" _! m5 _% ~  l0 N       mode="SQLServer"。2 Q$ f/ y; B% ~0 \. Q* }! L% D
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
$ t6 a: L3 L6 u( m. O5 J" ~! ]1 {       启动SqlServer和SqlServerAgent。
* F. X  f2 L8 o; h/ c6 B       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
6 i" Q4 I) z8 H4 z1 U       执行InstallSqlState.sql。+ `- J( R5 I' s: |1 f% N
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中8 G( }& i: `. D% c( V' M6 ]8 _7 Y
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
5 J  g+ d9 f3 s" l& H       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,- K; v# q& D: N' Y
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
, \- L+ I1 ]! k, a+ E( d  z8 m' P+ H3 G+ X* |* f; O1 h
新建一个Asp.netWebSite,按F5,一切OK。6 n) |1 ^/ q% e
效果图形
: l$ M2 P) z4 e$ G5 f两张表6 C( d8 k$ D& q: |) \/ d1 F
[attach]429[/attach]5 A" A, ]/ o+ z
ASPStateTempApplications表的数据* I3 P! R& _7 Q& e9 s0 }
[attach]430[/attach]0 a; R; s  l' f9 L! w; d) D
ASPStateTempSessions表的数据+ M5 v8 ^; U/ w+ e! ~, i
[attach]428[/attach]$ D" `0 i+ a" N* f5 P* M3 P' p+ Z( u
ASPState_Job_DeleteExpiredSessions作业
( u$ U, g6 ]: F& v) I/ w5 d+ W/ ~, U[attach]431[/attach]
) F1 V4 C( p  k9 V% K9 l  J  S) M5 R$ K  W" E
需要注意的地方;+ r9 d+ P+ z3 N7 O" @
4 @6 M& j2 H+ _  o
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
+ ^7 i: R7 k. y二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。  n' ^# Y7 M# \! A0 [, M1 ~6 p
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
, U9 Y, W/ m7 ~) f$ P
8 `8 j5 b. [& D8 b3 ~" P结束6 c8 c3 D7 e1 b" y' c, ~* u
    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是
  ^4 w5 G5 a! z* @- a+ k$ P<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




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