晨鸟科技

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

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑 0 ]% K6 y- t2 p; O, O! C! q: P

, o: l( G* O( `0 p( `( f关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。7 r" S( t. |/ i
    进入主题。- y( ~) F0 c& o
9 V3 M# a% g. A6 j3 U
情景一,Session ID在客户端的状态
' ~* y* P! n5 v        情景一中,saved in cookies情况' S# W6 h4 q, h2 }+ @* J
        ID保存在client端的Cookies集合中
$ ~' B% J" ^6 C  t        缺点是,如果client端的cookie被禁用,那么ID无法保存: }/ i1 E9 c4 `9 z/ U; n
        设置cookieless="false"
( P0 G6 {. u/ t( ~4 O$ A5 [; a5 D$ D1 c. j7 [( K3 c, e, a+ s
<sessionState# u# y2 r4 I- [& h
mode="InProc"" R) A% ^1 S( t
stateConnectionString="tcpip=127.0.0.1:42424"
2 p) J' {# o2 y0 u+ C5 AsqlConnectionString="datasource=127.0.0.1;userid=sa;password="
! F; \! s' t+ z3 Z3 f0 y% j+ Wcookieless="false"& [: ^$ U+ Y1 u! d
timeout="20"/>
2 u/ B# `5 ?. d" w/ l; `% o
9 a/ z/ T4 N4 B+ l6 l- n: O8 b        情景一中,saved in url情况; Z8 i# j3 u& C1 b8 q
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
5 O) q. A1 S2 e) `2 o+ t9 u        设置cookieless="true"+ Z) i0 A7 \6 \# H# Z

! g! x9 Z3 h. R<sessionState+ ~+ `9 v: @- y
    mode="InProc"
4 Z) H7 k$ r/ n3 N    stateConnectionString="tcpip=127.0.0.1:42424"
; [( a1 p. q4 M6 g, |2 z    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="* D+ I8 Y& _6 G" P: j
    cookieless="true"
  e7 C/ @6 k5 |) H  y    timeout="20"/>  o  r! ]: P6 D2 v# s9 \, m

2 k; M; ]- d* l1 f       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。/ p" l/ G3 t9 U0 `" ?
            情景二中,saved in 进程内: V8 i3 g9 y1 {6 T
            设置mode="InProc"' K9 ]3 S+ A0 H2 `* O9 `! I4 J- [
            优点;保存在本机内存中,无需跨网络,访问内存速度快6 ?6 R& \+ F1 H3 p, {( U' r& [8 }
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态$ I" ^6 g- V* }  i' c$ c+ Q9 J
+ D' z9 Z5 t! T3 r2 _
       <sessionState1 T7 Y! `' {" ?+ w. |
            mode="InProc"
4 e9 R" p* i& _& g6 ^: g          stateConnectionString="tcpip=127.0.0.1:42424"
; o# n4 W9 a: M9 I            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="0 Z% z" m, A+ J2 w- u
            cookieless="false"' e7 `" y  N) X5 ^
            timeout="20"/>
$ s0 V9 M2 b3 `) m& B" B1 l9 O% ?1 M: o# {% u
           情景二中,saved in 进程外
1 O( n; X4 Z# J( W) D           设置mode="StateServer",启动asp.net状态服务
/ x3 p9 V# Y  F% X* s7 |           定位注册表, d! z0 Y- r4 f4 ]. W. ^
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424& `' N4 M0 l' P1 t! N
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
! f; s  s: }) B2 a8 x1 G) m           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。: U8 m# g! p; A" W) ~
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",: h  r8 m# |0 H5 Q) m. ^
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
8 W+ j$ s5 \9 G4 b+ X: ~$ i3 z# W           不管你的状态保存时间设置时间有多长,一律失效,: S. l6 y/ F5 T/ l/ T9 a; |
           不信可以考试试,^-^。3 _$ ~. p8 D5 q+ Q8 F8 B
7 C" B6 w4 o6 j( A& H! @" g2 Q  M
    <sessionState% W) M+ W2 t" \
        mode="StateServer"
* S' `* ^' Q3 Y; s6 n$ {        stateConnectionString="tcpip=127.0.0.1:42424"9 Q7 t* d( V0 ?6 L/ ]
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="9 e* W! P5 l& S  e6 t5 a
        cookieless="false"
1 g! @* \9 I' q# y! I        timeout="20"/>
& k; _1 w7 t0 T3 ]6 v6 h8 S' @
: T7 k! F' R9 e9 p0 Q' ^" R       情景二中,saved in 数据库
3 }7 y. h5 a1 L! h' v7 M. h2 L3 ~       设置
- p3 V+ n3 l6 s       mode="SQLServer"。' \0 p' i1 @/ l# r2 D$ y/ x: l
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
# ]2 N+ u9 S% i       启动SqlServer和SqlServerAgent。! Q' N1 p4 a4 P% n
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。8 M# f0 F& V! g3 D
       执行InstallSqlState.sql。# ~. E" `$ ]) C+ y; s5 [0 }
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中; f7 o# R! X. V! y; W- N1 s( Q
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,/ U7 M; g& |' ^# u( @
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,( d* k$ }1 E( q# b- |
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
/ V- G, F5 a: \/ B8 c- v2 u( A) h9 ?( B! c; q
新建一个Asp.netWebSite,按F5,一切OK。
+ d! `' j9 a) b; b效果图形 * g  A! j1 X. r0 @) O$ p6 Q% |
两张表+ C7 H, @  o6 y# @
[attach]429[/attach]
- _/ N8 ~+ V  ]! K( \ASPStateTempApplications表的数据$ ?' D( ]; \; i
[attach]430[/attach]% X- b' Z- d- w* K
ASPStateTempSessions表的数据
  B! P6 G, @- @[attach]428[/attach]
. n0 o0 h, k5 P% N/ Y+ aASPState_Job_DeleteExpiredSessions作业
- Y/ x7 |2 Y  g& A9 h; G[attach]431[/attach]
. @% n- Z: {- C; I
8 M% ^2 Q4 @7 I. R$ m需要注意的地方;
9 W* U% G2 z6 O: U; {, |8 }# _1 n  M
+ U& o9 z9 O6 o, y) }1 [一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。0 P% ^$ ?+ a) [
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。0 D# E. K# e1 K5 c) f" p! Y. L
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"1 O; ~9 l5 b# I" l

5 ^9 m/ `" v( {2 _, y# M% n8 p结束
# t! ^$ e6 h: O* D! n6 K; d    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是+ d1 V1 S" {% F7 W- D( ^
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




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