本帖最后由 Star 于 2011-3-4 17:10 编辑 1 g5 j4 J/ \/ {1 f
, u) s' |7 E6 o; H
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
0 \% y9 E% B7 u G1 \& o 进入主题。
* H5 q; J; E* Z0 c7 k6 A4 a0 z
0 c" _0 s/ D: V9 U' W情景一,Session ID在客户端的状态1 X, Q& s) |. M! y" C9 `% x( L
情景一中,saved in cookies情况
9 z8 V. I8 X3 {5 l+ U1 | ID保存在client端的Cookies集合中/ l# r9 S8 P# p8 ]9 t2 Q) d! o
缺点是,如果client端的cookie被禁用,那么ID无法保存8 S" R( K7 e) d7 m J8 `0 s
设置cookieless="false"
. \5 h6 x4 H* s0 m W+ ]/ x6 E6 @: `
<sessionState; |: [' O3 L: h% B) k, p3 Y$ x
mode="InProc"
. o9 d2 f+ N$ z' X! T# PstateConnectionString="tcpip=127.0.0.1:42424"% k( U5 Z7 h! i; F2 D
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="6 C2 d3 D, o7 B- ~
cookieless="false"# H! w5 J, e/ `. V
timeout="20"/>6 T8 D7 {6 \* }3 b p* [
h- n3 q5 N: t; f 情景一中,saved in url情况
2 B% |* A$ [% @6 ^8 L; ]* \7 z MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中./ X3 p: [7 e8 {2 n) B ^' U
设置cookieless="true"
9 O9 E. i5 H- ^& e$ z
?7 G6 H& {# _1 K n+ x3 H<sessionState
+ P: P. S" k! w7 ?" C4 a mode="InProc"
! \0 }" W% g1 T. T5 i7 ]& Q! ~: [ stateConnectionString="tcpip=127.0.0.1:42424"
5 A; W" `3 z8 C& h+ W sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: ~3 T: s& V, @ cookieless="true"
: `4 q& i, {) O- B7 v timeout="20"/>* E6 X! _, ]. H1 n1 X8 Z: v5 K
) q4 q4 Y3 L* x9 N 情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。9 H3 c" n+ J; r+ T3 X( S" t. o
情景二中,saved in 进程内
8 m- o( P% k+ ~5 D 设置mode="InProc"
6 q2 M: R, R L3 | 优点;保存在本机内存中,无需跨网络,访问内存速度快
8 i2 D, D' x7 q1 ` L 缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
2 m* w |! p- E* [
' s" z7 z0 r" T! p' R5 t3 n, J* z <sessionState/ O& R/ w- I0 Z! R# v. ]
mode="InProc"
9 S2 Y* o( _9 ?, ~( s stateConnectionString="tcpip=127.0.0.1:42424", A1 A4 u( @) T7 X
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="& d4 k" E/ `& Y
cookieless="false"
7 Z1 J' O+ \$ J+ l9 H" {# s3 O timeout="20"/>
9 E4 |' ^. b5 B: t: m
6 }, `1 x1 h8 e5 a5 o' A 情景二中,saved in 进程外
- b2 _; ^! A" M X0 a 设置mode="StateServer",启动asp.net状态服务: O6 i# c p+ m& L" j
定位注册表
+ L% T4 p0 T! _ “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
+ m3 d: j0 n; y5 L 注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。( P# b ]; E1 z3 u+ {9 b4 ?# A
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
4 U5 L8 c$ i4 F1 \. e, E 如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
- v+ |8 I7 [* r; Y& K% Q 如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,) e. G$ D# m; k! y1 B, o
不管你的状态保存时间设置时间有多长,一律失效,
% [* o4 R4 K, o" h! R6 |. b e( Y 不信可以考试试,^-^。
! o- E" a7 w _: `- ]( `' q+ g' Y
; g" N( _# |6 B. V <sessionState/ |8 w3 C& p! i* m" b
mode="StateServer"; p4 N7 L# K7 r9 q. J' d
stateConnectionString="tcpip=127.0.0.1:42424"
9 ?+ z$ K6 ?# v1 } sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
- r: z4 g6 V/ c. { cookieless="false"; _- S: @7 D$ b/ K
timeout="20"/>- @& b2 x2 S P5 ^( `6 t
. b0 }; r) S* E 情景二中,saved in 数据库
+ Y& j9 t. q- [ j( R 设置
) J5 u6 X- ^% J3 j, |, ~ mode="SQLServer"。2 t6 N5 ]$ l+ p% n" D$ t8 U' o
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
) U6 V4 S5 D1 O* _) Y 启动SqlServer和SqlServerAgent。2 M7 U) \& I0 K- x( f* @
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
. T w- K$ s- e5 O" C8 m6 w0 x$ j( E 执行InstallSqlState.sql。, G; R) ?& E; z
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
7 O+ H- _ J, U. U 存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称," ^5 P- M _# } n: T0 u/ Q
实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
1 t4 n1 x% M( M/ l" S 发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
0 ]/ k! E2 n/ X: h9 p) _1 y" Z9 z' q7 D: K" X
新建一个Asp.netWebSite,按F5,一切OK。
6 x0 N6 q' W3 A2 Q: _5 w5 {效果图形
# U: a$ {) @) n3 \7 v H两张表, I& f* ^$ S2 ?6 H- h) U9 R
% {' F+ `+ K+ b9 k% `
ASPStateTempApplications表的数据
0 A+ L9 T1 \: d$ S; S) r
3 z( \1 q) p( C- W& yASPStateTempSessions表的数据. p6 }" y/ Q8 m( s' g; u
$ ?1 E! w8 M( x' T% R
ASPState_Job_DeleteExpiredSessions作业
" g. l# C$ N1 i+ n8 t5 @4 R% a, V f4 c
% f& @5 e" [! ]9 I$ q7 M& s
需要注意的地方;
4 s8 I1 A) o+ O
5 d% V& o1 d6 F6 A* B+ @2 S" J一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。+ ?8 [$ @+ ` _& F
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
+ K+ a3 Z2 `: R, d三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
' U3 w' y6 X$ u: |$ g4 V5 n- a3 J" i" n2 d3 y5 o S% k
结束
7 @6 W; W' T9 [% o 写得不妥之处,请多多指教! |