晨鸟科技
标题:
[转]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 S
mode="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 O
timeout="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 k
5 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! H
ASPStateTempApplications表的数据
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