晨鸟科技
标题:
[转]Session持久化
[打印本页]
作者:
Star
时间:
2011-3-4 16:59
标题:
[转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
, H |" r, Z0 U
' J4 s6 M# \, N, h" X! ?4 g w! ~
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
9 Z. H) R5 m r* t0 d
进入主题。
' x! \* i2 O8 N, L
* U) A: F' E" t4 D. Y+ y/ @
情景一,Session ID在客户端的状态
?' k3 r: g- z W8 K* y5 }) L3 @
情景一中,saved in cookies情况
, \! F3 c% @1 g+ [$ R/ G9 d: X
ID保存在client端的Cookies集合中
1 e; y; Y- ~1 Y/ a# B
缺点是,如果client端的cookie被禁用,那么ID无法保存
0 ~/ f% T" R4 C' Q' X
设置cookieless="false"
3 t4 K% ~6 z8 x- Q8 o6 N
p" ]8 p- o6 C9 j
<sessionState
6 x3 e2 e( ^4 h" Z' T4 x
mode="InProc"
; j8 ?, e5 \) r0 j$ T. k
stateConnectionString="tcpip=127.0.0.1:42424"
# y) a5 F5 q$ ?$ q( u) c
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
- ]; z F1 P& I4 I' F
cookieless="false"
5 R% R* e/ e' n: {! N. U6 B6 s
timeout="20"/>
+ c3 b3 C6 _; e" d4 I8 E: V
! Q u: u6 @5 F- W' ~5 |
情景一中,saved in url情况
" m" X. y% e m4 b! H8 s1 k' d
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
/ x4 \( \$ U6 |0 p/ q+ t
设置cookieless="true"
3 [) W) c% Y9 W# I% t; ~
# e9 ^1 _* ^. N; {3 m
<sessionState
Y2 j6 R! K: \& p" L
mode="InProc"
( V+ u! [/ }; E5 V) j7 z, f7 z
stateConnectionString="tcpip=127.0.0.1:42424"
" J( K, G8 z& W1 G. S/ x3 ?
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
! @; l/ C% s0 N" _ c) ^+ w
cookieless="true"
% s# g9 ^9 y2 E m& {- v; w, @5 ?
timeout="20"/>
1 h, g+ L2 s/ u: I8 q, m
" R/ Q& G; c/ O, v9 E
情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
$ [9 }& H3 c% ~; q, A
情景二中,saved in 进程内
: E2 [! W: ^6 O6 K, a
设置mode="InProc"
2 V& W% y0 u2 V4 K0 C+ J% O) n
优点;保存在本机内存中,无需跨网络,访问内存速度快
6 _6 i& @0 x9 {; K
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
( j' Q( `1 I3 W* V" \
( w! x" \ }9 t7 o0 F
<sessionState
+ O# w+ y+ n& o; k. s0 c
mode="InProc"
3 W$ l3 }# n5 e' n
stateConnectionString="tcpip=127.0.0.1:42424"
% f+ b; `- S q6 w# d. i8 ^( y3 Z
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: s( |; e4 [9 I
cookieless="false"
' x9 ^9 k1 s7 c, L0 @+ \: B; f3 b
timeout="20"/>
$ `, m. g, [/ t' B" P# E; ~
3 ^/ z( I9 r5 n# j3 T, M
情景二中,saved in 进程外
) r- G L2 k& R$ l* r) B
设置mode="StateServer",启动asp.net状态服务
, u/ w5 B1 ?6 Z/ T8 E
定位注册表
S9 A5 Y( Y' R' d" p# | q7 L
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
1 P1 h3 G( N. ~$ ^. p( J
注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
: W5 `9 i8 i7 R! G
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
; S, `' ?3 `" V7 u2 l" p
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
+ C: \+ {- ? ]1 D' M
如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
$ f0 @, m0 C8 ~9 L2 X/ }5 s& {
不管你的状态保存时间设置时间有多长,一律失效,
& N% b) [ _9 z1 m0 Y
不信可以考试试,^-^。
# L: ~% a7 l" E! x( g
; B [5 B& r' D3 N; R. P
<sessionState
' ]3 [2 h: q7 h0 t
mode="StateServer"
) o0 P* _, t: J/ n* n
stateConnectionString="tcpip=127.0.0.1:42424"
8 O2 Y4 d8 }) d; h' |
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
6 m& F+ l/ ?2 R; }1 O, f
cookieless="false"
% o& Y# P2 {7 l w8 t/ Q6 O) w
timeout="20"/>
; ]: `) T- K. P+ }$ {; f" P l
: S* @6 {1 f, a$ \
情景二中,saved in 数据库
1 l1 U3 _! ?7 a# \: m# z* g0 }0 a
设置
) s) n* R5 _6 L3 t( U
mode="SQLServer"。
7 o& z6 K( A) z& M) c* X* ]! c
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
& I% v, v7 [2 Z" }
启动SqlServer和SqlServerAgent。
/ ?5 p% E1 Q" \5 ]+ u7 g" S
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
: |# z. y+ R Z) W
执行InstallSqlState.sql。
( [$ F* U# A2 c' B/ d: M5 m
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
9 n& f' F. X) V% s
存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
4 n+ l' _# u( A3 P- y0 [: \$ F m; \
实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
; y+ N/ W. h+ [+ I# {- n4 M
发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
3 F0 }) z1 |( S) V3 H8 N# O+ E
& ?. W6 b5 _+ l, o$ m. S# s
新建一个Asp.netWebSite,按F5,一切OK。
6 P& E0 a4 C: w
效果图形
& A, N* G6 k" ^
两张表
( d2 J, ?4 z$ o F4 q/ x* S
[attach]429[/attach]
; n6 ]6 g q7 B
ASPStateTempApplications表的数据
% G9 L: M) o- q$ u7 n9 m
[attach]430[/attach]
6 J3 F/ l" P9 d3 \. A4 h
ASPStateTempSessions表的数据
; W% e& ]$ Z8 U2 {% M3 b. D* j3 L/ K
[attach]428[/attach]
5 {) S! X2 ^+ ^: L3 k# Y5 c6 k9 |2 I
ASPState_Job_DeleteExpiredSessions作业
: U( Z8 z. \% C' s2 J
[attach]431[/attach]
H5 g- r1 _; e
" Y; _6 z; r4 P
需要注意的地方;
" ]- L# Z& ]( y$ r. x. n
) [8 x8 h3 ? E; L0 _
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
! r; [9 C: ^; I* y8 Y
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
6 \9 `8 Q. C6 C' N& v0 W
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
5 M# J2 H6 ] j: {8 N8 {
& \4 r8 J7 K& Z+ f% h
结束
. L' `$ W. O& q+ Q2 e0 Z
写得不妥之处,请多多指教!
作者:
Star
时间:
2011-3-4 17:10
EB_EXP中直接用的是
7 E/ K0 _& {6 B/ r# A9 J% n! f$ v, _
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2