晨鸟科技
标题:
[转]Session持久化
[打印本页]
作者:
Star
时间:
2011-3-4 16:59
标题:
[转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
. P! c1 _" e5 o4 G
; L" R/ o" u. a
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
: D2 P2 v, N: r' W+ k& d3 i
进入主题。
$ i, B) V+ z, ]! H5 g
0 l) z1 K7 P1 N' y5 @# n# m( |
情景一,Session ID在客户端的状态
5 c8 [+ y7 j3 G
情景一中,saved in cookies情况
7 o, }, [# u: r% |0 ~7 J& |% {
ID保存在client端的Cookies集合中
: _# l8 w0 m1 Y' ]" K# ?% j
缺点是,如果client端的cookie被禁用,那么ID无法保存
$ m) n# s+ ?$ t P0 c
设置cookieless="false"
% c" C5 G6 t0 A! P- E& ]+ g
2 d* U. r2 \; C1 j7 p" I9 @
<sessionState
. Y- r K% e; @4 Y/ \
mode="InProc"
# {1 ]' y# v& Y- Y% p
stateConnectionString="tcpip=127.0.0.1:42424"
+ r& ~, z, @3 z" x3 W5 q
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
" e! B! I0 _; T9 k; K6 k" J
cookieless="false"
/ _, g# |* T/ i! {2 X
timeout="20"/>
6 o6 {7 T7 e, K& A Z
, a8 i) R+ P, j9 M
情景一中,saved in url情况
4 d1 |- s' r* l$ c, d4 w+ G* x/ Z4 b
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
6 d7 X/ i- u2 n3 v
设置cookieless="true"
$ C; V J2 R( t! d0 ]! i' {' s# @
* V9 X( L0 }( x) a; w
<sessionState
8 _8 R' R3 B: w4 W
mode="InProc"
. l' D* @* V9 t; u; m& E7 S' X6 b
stateConnectionString="tcpip=127.0.0.1:42424"
4 _( j2 Y1 n$ ]# M6 N) }9 w0 \
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
! X/ q. _' `1 F
cookieless="true"
' b/ |) C8 l7 z% r! G1 u
timeout="20"/>
; m# n" n& x8 [
% Q4 p, A2 b1 Y
情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
$ ^1 g! t* s$ d- l6 C
情景二中,saved in 进程内
' a! r0 a- d$ w2 \( K4 f
设置mode="InProc"
7 B4 Y% G5 ^5 A, y8 N0 j) E
优点;保存在本机内存中,无需跨网络,访问内存速度快
3 N3 j4 F4 k* ~8 ~) L/ m/ p/ c
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
9 c. t* y1 J, ]/ J' l1 B
' h3 _( J2 C1 ]3 t+ L9 O
<sessionState
: _/ X! P* X) V! ?$ f4 @
mode="InProc"
$ u7 g) S- g; ^7 }
stateConnectionString="tcpip=127.0.0.1:42424"
) N5 E# n, d8 B; E6 Q o. g
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
& ^, r0 l5 W" ~, C! f
cookieless="false"
) Q; J' i" C* E) i2 \
timeout="20"/>
7 U) N! Q* u: V2 _4 y. k
0 d0 D' \- R0 ~2 m/ H5 c! r
情景二中,saved in 进程外
* @& X2 Y# h- l7 U
设置mode="StateServer",启动asp.net状态服务
% R6 N- M& n( P5 [/ G
定位注册表
* t3 n1 k; [0 r3 }. ]3 @
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
+ l7 r& p, Z" W! l; ~
注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
/ Q6 t) |7 t5 R8 v9 H" h
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
" W; {) e0 h* \; ?
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
. U& K6 O" K7 `, [
如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
4 `9 E; x) n5 V- ?
不管你的状态保存时间设置时间有多长,一律失效,
4 g% [4 ?4 n, A( N/ n/ I$ [
不信可以考试试,^-^。
0 U. ^2 h+ ]9 `
+ @7 {& u! @8 {2 r% P
<sessionState
/ b9 c; y2 W! R# o# M7 H
mode="StateServer"
% g S* O8 N! P
stateConnectionString="tcpip=127.0.0.1:42424"
/ i% N i) _3 Q, ~/ v2 [
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
+ I- a; `0 F. n- S; W
cookieless="false"
; Y- @: T5 M* Q7 @& i5 C
timeout="20"/>
Z2 |1 V6 ^# A2 e7 n/ Z
/ P. O$ v7 e' Z6 `
情景二中,saved in 数据库
5 P" U! } o* A8 A% i
设置
: H% e6 Y4 i9 C+ V% p
mode="SQLServer"。
* [; Q. u& k- I8 v5 l
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
8 H! v/ p: \9 h
启动SqlServer和SqlServerAgent。
5 _3 `. R1 i) i4 \9 F' u: j( U
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
" S& P7 N3 M+ z
执行InstallSqlState.sql。
) M) x' I& X+ p6 C6 H
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
) @% H3 ?$ _* b+ y ?
存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
& @! i* K5 ^ Y
实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
* z; y) t2 R* l& Z: d. k. G8 O
发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
7 t* x5 ?7 f" m/ S5 W1 |1 o
C/ e2 u# V$ `4 K/ V
新建一个Asp.netWebSite,按F5,一切OK。
9 M3 U( X: Z7 S0 q
效果图形
; M! f# w: K: _: e8 V% B
两张表
% J6 V& Q8 G' j% |% g8 ?9 l' r
[attach]429[/attach]
2 x4 o8 v' p! g9 ~ a( ?" ~) M8 O
ASPStateTempApplications表的数据
; _' [5 f7 Q D$ n2 A0 j1 z
[attach]430[/attach]
& }- G: q2 |( W* k; _1 h
ASPStateTempSessions表的数据
& u+ D/ |( V( Q2 N2 ?& T
[attach]428[/attach]
' }$ d. O2 f( e& @6 O
ASPState_Job_DeleteExpiredSessions作业
$ I/ \4 V: B( I* m
[attach]431[/attach]
`' Q, @ N9 e* I2 B! u" L4 j
/ X- T" n; ~2 R& X0 D% K7 ^, p; z
需要注意的地方;
# x* ?8 J. W% N
) X. L- o6 g- [$ K( _) U
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
3 c1 y! Q: G8 @" H7 y* O/ `
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
3 Z: ]2 x0 J: J. h6 j# e
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
0 c& @; X9 a- F) ^2 M
4 A% k# P5 o0 D& P* y% O8 q; T
结束
' ?5 k1 z; R, n3 I, d
写得不妥之处,请多多指教!
作者:
Star
时间:
2011-3-4 17:10
EB_EXP中直接用的是
" q# B6 H7 L, o
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2