晨鸟科技

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

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑 3 S7 M. f+ L( u! g! i

: y8 D4 t( G7 }' o4 `/ d关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。, H6 Z8 `, ]/ P% `
    进入主题。
1 C" e5 r1 W1 r$ U
! w$ D6 H& N. {( g% l6 `. K# h. M情景一,Session ID在客户端的状态
1 I! M0 S: S4 a        情景一中,saved in cookies情况
1 I) s0 q; v6 m$ \' i        ID保存在client端的Cookies集合中
6 Y7 l6 u) _2 A. a3 O        缺点是,如果client端的cookie被禁用,那么ID无法保存. V: R8 R2 Z4 x  V0 t; }8 |
        设置cookieless="false". X. P) w0 ?5 L# Y, {
' {" a' I! M8 `9 i; w  y$ `8 ?3 j, N
<sessionState
4 G7 u5 a' h) x8 Smode="InProc"" p) I5 Q6 }# {
stateConnectionString="tcpip=127.0.0.1:42424"2 G. ]4 @0 ?* {# x" o& Y) |) m6 x* n
sqlConnectionString="datasource=127.0.0.1;userid=sa;password=": p2 t1 R/ S# y; f
cookieless="false"
' S) B! U0 ~: ~+ L" A/ t$ W2 o0 Otimeout="20"/>) m: z( C$ G- ?, r8 ~: ?- s" Q# s: E, d

3 e) Y2 X7 T4 x) }* S; T8 k- A        情景一中,saved in url情况# n7 G; j, G/ ?
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中." i/ I$ q8 W: Z& P5 U
        设置cookieless="true", `8 b3 v2 T4 m! a1 }+ ~

7 m+ U" x8 y8 j4 O* s6 ^- x<sessionState/ d# w5 w" f" B5 |( _" x
    mode="InProc"
6 }4 W' ?- m  h# _$ T# n) L5 e4 [& u    stateConnectionString="tcpip=127.0.0.1:42424"
( k, k' Y' U; I8 t    sqlConnectionString="datasource=127.0.0.1;userid=sa;password=": n; E) [8 c: f% b- @
    cookieless="true"
( l3 E# P8 c; O1 _+ y    timeout="20"/>
6 f9 x$ B; B/ ?( C5 k5 r1 W( |/ P( `, k; y7 R0 l
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。7 c( p* D- O! }% B+ z/ B! y
            情景二中,saved in 进程内2 m- W  Z% S3 U0 W1 v
            设置mode="InProc"
2 a. J3 _8 L" n; M" d, y5 x6 k            优点;保存在本机内存中,无需跨网络,访问内存速度快8 K/ N( u" p. \! }5 k$ c7 \. _
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
/ a! N/ ]+ t8 V% i7 x* B0 ]+ u$ `* _- p# w' B* n' v
       <sessionState
8 m4 [$ z" }) T8 I6 {0 I3 x7 ~            mode="InProc"2 a/ }* u# u/ ]$ V  r6 ?  N
          stateConnectionString="tcpip=127.0.0.1:42424"
2 z& _: B" L. h7 Y# \% r( Q( I8 N            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="& ?' [4 _( _" _: R" N
            cookieless="false"
8 P5 C+ J* z* E: n) g            timeout="20"/>
' a8 O+ j, m# c# C1 M' N
0 b; Y# W9 q# E* _2 j# r! }# O2 a           情景二中,saved in 进程外/ O2 q- a/ x1 ?8 V- A
           设置mode="StateServer",启动asp.net状态服务5 @, i# E6 M  d: `
           定位注册表) r4 o$ g" {! \7 ?/ y
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
" e( d0 o* E) d% h  J8 N! C+ b" u: f           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。: U4 y* D6 D, P6 n! J7 y
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。! s/ W" c- M9 N; _
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",) S& o4 |9 i9 g0 ?
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,4 M. K: ?! X* I. d0 \0 z2 N
           不管你的状态保存时间设置时间有多长,一律失效," ~% d3 O0 B' o: P( a0 V- I: c
           不信可以考试试,^-^。0 P2 R5 |2 D" b8 f4 t& U4 j

# n0 ^* G- q9 V' e# E2 B: u2 v    <sessionState+ O6 r7 Y5 h, W! ?: O* c5 |% ]6 F
        mode="StateServer"* E* c( u5 g+ U" T
        stateConnectionString="tcpip=127.0.0.1:42424"8 U2 g- w$ L) s4 |
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
5 p9 g' t: g8 l/ e        cookieless="false"& I* V+ C0 |0 V. U1 H3 J& j
        timeout="20"/>
2 N( I. F9 t% R/ `
0 H. H5 Q9 q1 C9 X! c' f       情景二中,saved in 数据库
7 j  T; G$ G; r       设置0 r0 [; R& N& _" P2 i3 Q! v
       mode="SQLServer"。
5 h' v/ K# N9 t0 w( d+ s( o$ F       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。9 t2 G' L* N7 r+ d
       启动SqlServer和SqlServerAgent。
' a6 O$ Z- `4 F* J/ L, b1 E       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。5 h" n/ a% |  G/ }5 q, ^/ G
       执行InstallSqlState.sql。7 S0 e+ _/ \6 t" V
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
" k% b, ~! k8 m6 y% |8 o  i% s. e       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,8 @* w% B$ ^; i- |* L' \0 `
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
3 S+ ]4 e, l* G; G! P/ T2 [# h       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。: w8 _; y4 J) t8 X) g: F

; W0 ]' N% i) l& V5 F: X新建一个Asp.netWebSite,按F5,一切OK。# l5 q) z& M8 ], M
效果图形 ( Q( S% ^: S4 K& l' b/ B3 O9 k
两张表
' V5 [, h  X0 y. X* F5 q$ c [attach]429[/attach]
5 V0 ~1 \4 b) o4 @: R! HASPStateTempApplications表的数据
5 L- k# }! |: I( b" m3 K& W! }[attach]430[/attach]1 `# W; n+ e8 f7 F
ASPStateTempSessions表的数据9 x9 K3 Q8 ^0 r) T
[attach]428[/attach]! `; S8 U+ ]5 Z) x6 s+ O* f: M
ASPState_Job_DeleteExpiredSessions作业
* y: s  |" j$ F7 q+ _8 f$ b[attach]431[/attach]
2 G" O0 D  H9 A* a0 Y, w; }0 H8 W! I# B+ p5 J! Y
需要注意的地方;( {; f) i% z! j2 R6 f

6 c; q9 k* R% `$ ~* a5 r一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
& A# ]; H# d( g二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
0 P+ {- j9 P9 U' L三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
# h0 C- {& z& s1 |: k% V% b8 v
8 I7 l5 R0 o& y9 f2 H. G( B结束
5 y% Q. K% N8 z; d/ T1 S9 H" d; e    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是0 a" L- r" o7 P6 b" u
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




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