晨鸟科技
标题:
[转]Session持久化
[打印本页]
作者:
Star
时间:
2011-3-4 16:59
标题:
[转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
( w$ ?- z3 L+ b U1 Q
7 |4 ~ T/ _; _ K5 k; E
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
# e0 `& f c. \* S; A
进入主题。
. m# U; y! |# y g$ U( U5 C1 e- O7 ?
3 |! F7 q. c3 X8 Q( D, V" j" L
情景一,Session ID在客户端的状态
% [/ O4 e( e5 J7 i! N! |0 }
情景一中,saved in cookies情况
9 m2 p' k& o. a }$ n$ s: k
ID保存在client端的Cookies集合中
; W" h: r: g! J: J! n2 S: B
缺点是,如果client端的cookie被禁用,那么ID无法保存
- K8 ]2 [9 R4 C9 L O y1 o. \+ _
设置cookieless="false"
4 u( k( p8 f) w4 }9 ~; N
: q3 m2 L& Y) e8 J. @, c
<sessionState
, v1 R/ P5 Z" q+ D* p* R% Y
mode="InProc"
: H0 y) F! Q2 w2 m" n: i8 t
stateConnectionString="tcpip=127.0.0.1:42424"
! h# V/ z" I7 |3 m2 y
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
. v, y# U" t/ |- z' R
cookieless="false"
, V; z* V5 J* r Z0 l
timeout="20"/>
$ c4 J% v% \8 [7 W0 U! i1 i) t
& ]8 O2 H) h" m! g! ~- }1 b$ K8 d
情景一中,saved in url情况
6 Y6 {) e! F4 O
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
5 A; r2 ^7 a! N! ]2 [1 @3 @
设置cookieless="true"
% m% P l! Q4 J
T) h5 C$ V4 W4 e$ N
<sessionState
9 |. f9 z0 x( P* y8 }
mode="InProc"
, }' O- `- n3 S% F' v% P `2 m( o
stateConnectionString="tcpip=127.0.0.1:42424"
# \8 @$ C- T& U, r2 l
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
9 I6 M- ]" |* }4 p2 ? q. M
cookieless="true"
$ b# i7 t: T9 ~1 J
timeout="20"/>
4 D% w: L0 F' t# z, E
+ ^; G* U+ N' {5 p
情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
2 S9 X- B2 \3 G$ K% z
情景二中,saved in 进程内
& ^% g1 S8 w* f U% c; b6 D* y
设置mode="InProc"
& f1 o3 h7 U% V& o" n
优点;保存在本机内存中,无需跨网络,访问内存速度快
2 e) E% ~% j/ T- N& ?
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
/ |- X, h; U, @& ?: \/ [+ ~9 B5 ~. A
) p9 P6 `6 a, q3 ^ c$ m$ Y
<sessionState
# M& C, w$ ^9 x7 C9 v" h
mode="InProc"
/ O. v$ N- u, b' N% o A( U
stateConnectionString="tcpip=127.0.0.1:42424"
4 K; E# B5 B% X5 Z
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
; W( z m. t9 M: }; m# F8 S
cookieless="false"
5 W" p' M4 r; u# [
timeout="20"/>
* Z, x. q. x' s$ J* h* [7 O$ }
* E# B1 c' N d( X
情景二中,saved in 进程外
! T" c+ \7 U. P! z
设置mode="StateServer",启动asp.net状态服务
% }3 ~# E: S8 @
定位注册表
& K1 N2 W" C3 ~: x7 w* v+ A G
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
' D+ }: x0 ~$ k9 N) F8 t, P
注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
1 q! G! i( J+ G. R
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
: x9 |: @1 p! w- `+ J7 j9 ?2 `" X
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
% [- [0 H; |$ O" r+ a2 ^ b
如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
! J- n" S1 j+ c- F
不管你的状态保存时间设置时间有多长,一律失效,
( U" R1 e# ^; W$ ]7 o3 f
不信可以考试试,^-^。
2 x! f! H O8 E, @5 ~, Z
5 D/ o2 ?0 o9 x/ _+ R8 T: G
<sessionState
2 L) L! k5 ^1 q! |! i
mode="StateServer"
* {0 p+ V6 ~6 a: G9 }' \
stateConnectionString="tcpip=127.0.0.1:42424"
/ V: {' x w: ~" Z, u( |5 d
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
; \+ K; J! a" N6 N; v) ?* ~
cookieless="false"
* K* D6 w% f0 z( k
timeout="20"/>
4 t0 ]% d% c/ Y6 s+ ]6 r
% p; m- h' r( n
情景二中,saved in 数据库
" W! l K0 ^8 s2 p6 u# L7 ^( u
设置
6 Q( u G: [3 u; C" U5 d* R
mode="SQLServer"。
9 [0 w) e& S A2 w! |( L
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
, `" ]* Z, A# N3 H" U( d
启动SqlServer和SqlServerAgent。
9 m8 O( C+ ], A9 i' r; V& J, v
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
& o5 y8 m( ]1 |' C5 C
执行InstallSqlState.sql。
* m1 s2 v- G( Q9 d+ U! {, e7 s/ I8 {5 e
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
! V" L8 d0 `% [. d+ d' i! e
存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
% V! a/ g0 R) E; G" I( M/ i: J# s
实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
5 c& A' ~/ f6 |! z* r8 v$ G
发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
& {) }! J8 \$ e2 Z& ^
0 n6 f7 M! q+ n% }- E! X) [
新建一个Asp.netWebSite,按F5,一切OK。
% ?9 J1 Y; n5 G' ~* j8 _
效果图形
+ U8 ]: j+ U8 y4 D6 g% j
两张表
% H ]# O$ f- r1 S: M1 Z
[attach]429[/attach]
`8 l0 k% r. X
ASPStateTempApplications表的数据
7 d6 v8 V m8 T
[attach]430[/attach]
0 \- v1 R5 |) I0 o8 x7 [
ASPStateTempSessions表的数据
* L7 R& Q( q+ X6 [
[attach]428[/attach]
/ y# @2 p" v- T/ ]
ASPState_Job_DeleteExpiredSessions作业
! f) x- {2 V, s( B6 x3 r
[attach]431[/attach]
2 k' ^7 z- ^5 q$ x
1 G0 M# V/ U* x( B- {
需要注意的地方;
/ i8 e& O/ n& o3 F& Y3 u3 o# K
. H; c& Y1 s0 `( \
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
7 D$ A. v% S: X S) O5 h
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
$ e/ A: x( [0 ]' x
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
D" \+ ]4 R* }& F
) q* k9 c) \+ \6 ?
结束
# [9 \ }) T* `9 p! C
写得不妥之处,请多多指教!
作者:
Star
时间:
2011-3-4 17:10
EB_EXP中直接用的是
) x& w+ o/ H9 p! W/ `
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2