晨鸟科技

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

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑 . P! c1 _" e5 o4 G
; L" R/ o" u. a
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
: D2 P2 v, N: r' W+ k& d3 i    进入主题。$ i, B) V+ z, ]! H5 g
0 l) z1 K7 P1 N' y5 @# n# m( |
情景一,Session ID在客户端的状态
5 c8 [+ y7 j3 G        情景一中,saved in cookies情况
7 o, }, [# u: r% |0 ~7 J& |% {        ID保存在client端的Cookies集合中: _# l8 w0 m1 Y' ]" K# ?% j
        缺点是,如果client端的cookie被禁用,那么ID无法保存
$ m) n# s+ ?$ t  P0 c        设置cookieless="false"% c" C5 G6 t0 A! P- E& ]+ g
2 d* U. r2 \; C1 j7 p" I9 @
<sessionState. Y- r  K% e; @4 Y/ \
mode="InProc"# {1 ]' y# v& Y- Y% p
stateConnectionString="tcpip=127.0.0.1:42424"+ r& ~, z, @3 z" x3 W5 q
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="" e! B! I0 _; T9 k; K6 k" J
cookieless="false"
/ _, g# |* T/ i! {2 Xtimeout="20"/>
6 o6 {7 T7 e, K& A  Z
, a8 i) R+ P, j9 M        情景一中,saved in url情况4 d1 |- s' r* l$ c, d4 w+ G* x/ Z4 b
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.6 d7 X/ i- u2 n3 v
        设置cookieless="true"$ C; V  J2 R( t! d0 ]! i' {' s# @

* V9 X( L0 }( x) a; w<sessionState
8 _8 R' R3 B: w4 W    mode="InProc"
. l' D* @* V9 t; u; m& E7 S' X6 b    stateConnectionString="tcpip=127.0.0.1:42424"4 _( j2 Y1 n$ ]# M6 N) }9 w0 \
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
! X/ q. _' `1 F    cookieless="true"' b/ |) C8 l7 z% r! G1 u
    timeout="20"/>; m# n" n& x8 [
% Q4 p, A2 b1 Y
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
$ ^1 g! t* s$ d- l6 C            情景二中,saved in 进程内
' a! r0 a- d$ w2 \( K4 f            设置mode="InProc"7 B4 Y% G5 ^5 A, y8 N0 j) E
            优点;保存在本机内存中,无需跨网络,访问内存速度快
3 N3 j4 F4 k* ~8 ~) L/ m/ p/ c            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
9 c. t* y1 J, ]/ J' l1 B
' h3 _( J2 C1 ]3 t+ L9 O       <sessionState: _/ X! P* X) V! ?$ f4 @
            mode="InProc"
$ u7 g) S- g; ^7 }          stateConnectionString="tcpip=127.0.0.1:42424"
) N5 E# n, d8 B; E6 Q  o. g            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
& ^, r0 l5 W" ~, C! f            cookieless="false") Q; J' i" C* E) i2 \
            timeout="20"/>7 U) N! Q* u: V2 _4 y. k

0 d0 D' \- R0 ~2 m/ H5 c! r           情景二中,saved in 进程外* @& X2 Y# h- l7 U
           设置mode="StateServer",启动asp.net状态服务% R6 N- M& n( P5 [/ G
           定位注册表* t3 n1 k; [0 r3 }. ]3 @
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
+ l7 r& p, Z" W! l; ~           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
/ Q6 t) |7 t5 R8 v9 H" h           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
" W; {) e0 h* \; ?           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
. U& K6 O" K7 `, [           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,4 `9 E; x) n5 V- ?
           不管你的状态保存时间设置时间有多长,一律失效,4 g% [4 ?4 n, A( N/ n/ I$ [
           不信可以考试试,^-^。
0 U. ^2 h+ ]9 `+ @7 {& u! @8 {2 r% P
    <sessionState
/ b9 c; y2 W! R# o# M7 H        mode="StateServer"% g  S* O8 N! P
        stateConnectionString="tcpip=127.0.0.1:42424"/ i% N  i) _3 Q, ~/ v2 [
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="+ I- a; `0 F. n- S; W
        cookieless="false"; Y- @: T5 M* Q7 @& i5 C
        timeout="20"/>  Z2 |1 V6 ^# A2 e7 n/ Z
/ P. O$ v7 e' Z6 `
       情景二中,saved in 数据库
5 P" U! }  o* A8 A% i       设置
: H% e6 Y4 i9 C+ V% p       mode="SQLServer"。* [; Q. u& k- I8 v5 l
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。8 H! v/ p: \9 h
       启动SqlServer和SqlServerAgent。
5 _3 `. R1 i) i4 \9 F' u: j( U       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。" S& P7 N3 M+ z
       执行InstallSqlState.sql。
) M) x' I& X+ p6 C6 H       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
) @% H3 ?$ _* b+ y  ?       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
& @! i* K5 ^  Y       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,* z; y) t2 R* l& Z: d. k. G8 O
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。7 t* x5 ?7 f" m/ S5 W1 |1 o

  C/ e2 u# V$ `4 K/ V新建一个Asp.netWebSite,按F5,一切OK。
9 M3 U( X: Z7 S0 q效果图形 ; M! f# w: K: _: e8 V% B
两张表
% J6 V& Q8 G' j% |% g8 ?9 l' r [attach]429[/attach]
2 x4 o8 v' p! g9 ~  a( ?" ~) M8 OASPStateTempApplications表的数据
; _' [5 f7 Q  D$ n2 A0 j1 z[attach]430[/attach]
& }- G: q2 |( W* k; _1 hASPStateTempSessions表的数据& u+ D/ |( V( Q2 N2 ?& T
[attach]428[/attach]' }$ d. O2 f( e& @6 O
ASPState_Job_DeleteExpiredSessions作业$ I/ \4 V: B( I* m
[attach]431[/attach]
  `' Q, @  N9 e* I2 B! u" L4 j
/ X- T" n; ~2 R& X0 D% K7 ^, p; z需要注意的地方;
# x* ?8 J. W% N
) X. L- o6 g- [$ K( _) U一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
3 c1 y! Q: G8 @" H7 y* O/ `二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。3 Z: ]2 x0 J: J. h6 j# e
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
0 c& @; X9 a- F) ^2 M
4 A% k# P5 o0 D& P* y% O8 q; T结束
' ?5 k1 z; R, n3 I, d    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是
" q# B6 H7 L, o<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




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