晨鸟科技
标题:
[转]Session持久化
[打印本页]
作者:
Star
时间:
2011-3-4 16:59
标题:
[转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
8 ^5 k7 U) m: K0 D+ C" A, k
& P# K t' |; \! b+ C' w% W% [/ s
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
2 x2 u' P- V+ Y P
进入主题。
2 ] Q3 T" j+ K7 g
8 d* h; j4 s$ I8 |+ s2 ?
情景一,Session ID在客户端的状态
7 F6 g3 g. B) s7 X
情景一中,saved in cookies情况
/ ^' E/ D6 a; g& F7 x
ID保存在client端的Cookies集合中
: e6 P$ b) `" [' o" }3 A
缺点是,如果client端的cookie被禁用,那么ID无法保存
: {% O4 p2 o! A: ^
设置cookieless="false"
; T0 C; ~' u6 @5 n2 L+ g7 o
1 _; R0 R# f" m9 |' e. o% G( K/ D
<sessionState
3 {2 p: e- ~! @2 J; G
mode="InProc"
( D# m, p) y1 \9 `: ]
stateConnectionString="tcpip=127.0.0.1:42424"
+ R3 w! A. U/ S' X7 o0 H
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
7 k' [% M" Q/ Y4 y \$ b
cookieless="false"
6 S5 o0 L% R* D4 i
timeout="20"/>
& X, i2 _- t! f1 U0 d
1 ?1 B7 q* k- a$ W; Z1 e
情景一中,saved in url情况
( C( j% q, ^7 |; `1 O
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
6 g0 O9 R; ~7 m0 s) G- c
设置cookieless="true"
0 g. _, n+ ]4 J( u& V
# `% P }) ?2 D5 U2 S
<sessionState
% k; a! v g7 x5 X1 L5 j; Q2 y
mode="InProc"
# p; s; J, F5 E; |' X' a
stateConnectionString="tcpip=127.0.0.1:42424"
. K: b+ { l7 U8 J+ x1 B
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
, N6 `0 e2 Z3 }7 n4 L. p" A
cookieless="true"
( N. I; l' n0 k3 O5 Z' c D
timeout="20"/>
% u. S6 R$ t$ R5 O" P1 j% n
% E% k- Y" s8 b% F2 X0 _* Z4 M q
情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
9 e/ U# g; N( `; E7 g) ]5 s9 F
情景二中,saved in 进程内
4 ^7 R3 K/ S8 `* x) E! j
设置mode="InProc"
' C t4 t- R. Y) m! }
优点;保存在本机内存中,无需跨网络,访问内存速度快
! f5 x; }) I! L M# O* q* _
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
* R3 u% v0 P/ j% l$ y1 o! Y
. s2 s9 C9 h2 m
<sessionState
7 [- v6 Y8 W) _' ]! g$ S0 d
mode="InProc"
9 B: O& c% K' J) Z) n0 z; f- u
stateConnectionString="tcpip=127.0.0.1:42424"
6 D0 _' b3 {3 w; h" e# [
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
) T' @) f3 l1 X, w' Z1 D
cookieless="false"
$ T; r% t0 C% x' w7 F% O: O
timeout="20"/>
, @$ o2 T8 v" C" e
2 k4 P+ i- E7 C5 p) N! ^2 i1 Q
情景二中,saved in 进程外
6 H) {/ r* _$ U( V q, ]
设置mode="StateServer",启动asp.net状态服务
' W8 L. B# h5 O+ B9 P# m/ F+ u
定位注册表
" M3 ]8 `7 ] j* ^6 v7 j; |0 b
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
2 A) {( K# O; ?) |
注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
7 t: I' ~- O7 O) w
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
3 ^/ J/ n$ @( i7 y# B$ m
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
; |7 A7 k" ^, u
如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
4 I7 {3 J0 d- w- }/ x
不管你的状态保存时间设置时间有多长,一律失效,
7 o1 P# z& H3 \9 t9 `( V
不信可以考试试,^-^。
. f2 r: [' R8 M% P
/ K' |" f, p# i) {
<sessionState
' \; D9 o& V5 s; o, e/ f: v) P
mode="StateServer"
/ _; R# T7 l, o# u+ O7 O
stateConnectionString="tcpip=127.0.0.1:42424"
6 F0 z4 M1 \5 Q2 L
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
# N$ [) u* k2 V% A1 E; k
cookieless="false"
$ M- K# u4 z( J$ a u
timeout="20"/>
5 x7 S' [9 b8 P1 b
3 ^/ P7 J' _1 O5 `4 v
情景二中,saved in 数据库
I& D/ e) z2 I1 w% k. L
设置
: W+ F1 |2 I9 M% c
mode="SQLServer"。
* e- H9 `0 r% h
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
4 J; a+ R, Z0 h) o+ B# A
启动SqlServer和SqlServerAgent。
; Y* }5 x y# \3 ~ F9 p9 X3 }' L
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
% M6 |5 l/ C* n
执行InstallSqlState.sql。
* |8 ^+ c5 t7 j9 l, M5 F
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
/ L4 S6 }1 {; V+ `5 K2 M1 L
存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
5 r0 \; s7 M j( K+ U
实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
8 s) J. U# L. h8 q9 l6 c9 F% W
发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
7 O6 k5 A9 ?8 X* Q' P
8 F! C, g* V& e! {% t/ |; y, V
新建一个Asp.netWebSite,按F5,一切OK。
9 N; I0 N* D4 Z
效果图形
5 T) D8 e9 G+ t4 S. p
两张表
, }6 M# k9 r) E( L
[attach]429[/attach]
& {0 y/ k5 I* a" Z" h+ {3 V
ASPStateTempApplications表的数据
( u+ j$ z( _* r$ ?/ B7 s( k% X
[attach]430[/attach]
" F! H6 P3 Y8 q: X- B
ASPStateTempSessions表的数据
9 n* ?1 \0 S8 v) O3 x2 c8 \
[attach]428[/attach]
! p7 i3 L2 e2 [0 ]+ p6 ?
ASPState_Job_DeleteExpiredSessions作业
7 @0 n$ y& _. i. s" A$ Q
[attach]431[/attach]
+ j; g/ J/ z! O% F5 \( n
, [, H- M) ?' N* r' f% d2 \( D' b
需要注意的地方;
% n0 _. X- w( M6 Y3 [
4 c& x8 S; Z! V5 D1 x% _& z& b
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
! }- p: D( j: }6 H& `* g- r+ p. _
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
( P% K: R" Z; r- Z$ J8 h# h
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
+ {% U$ d5 |; Z; L
% o& {4 p; h- n7 O) m& x
结束
' k/ B" p6 ]% z2 z* ?( {8 Y) v
写得不妥之处,请多多指教!
作者:
Star
时间:
2011-3-4 17:10
EB_EXP中直接用的是
; r2 B/ w( s8 m4 q
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2