晨鸟科技
标题:
[转]Session持久化
[打印本页]
作者:
Star
时间:
2011-3-4 16:59
标题:
[转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
0 ]% K6 y- t2 p; O, O! C! q: P
, o: l( G* O( `0 p( `( f
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
7 r" S( t. |/ i
进入主题。
- y( ~) F0 c& o
9 V3 M# a% g. A6 j3 U
情景一,Session ID在客户端的状态
' ~* y* P! n5 v
情景一中,saved in cookies情况
' S# W6 h4 q, h2 }+ @* J
ID保存在client端的Cookies集合中
$ ~' B% J" ^6 C t
缺点是,如果client端的cookie被禁用,那么ID无法保存
: }/ i1 E9 c4 `9 z/ U; n
设置cookieless="false"
( P0 G6 {. u/ t( ~4 O$ A5 [
; a5 D$ D1 c. j7 [( K3 c, e, a+ s
<sessionState
# u# y2 r4 I- [& h
mode="InProc"
" R) A% ^1 S( t
stateConnectionString="tcpip=127.0.0.1:42424"
2 p) J' {# o2 y0 u+ C5 A
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
! F; \! s' t+ z3 Z3 f0 y% j+ W
cookieless="false"
& [: ^$ U+ Y1 u! d
timeout="20"/>
2 u/ B# `5 ?. d" w/ l; `% o
9 a/ z/ T4 N4 B+ l6 l- n: O8 b
情景一中,saved in url情况
; Z8 i# j3 u& C1 b8 q
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
5 O) q. A1 S2 e) `2 o+ t9 u
设置cookieless="true"
+ Z) i0 A7 \6 \# H# Z
! g! x9 Z3 h. R
<sessionState
+ ~+ `9 v: @- y
mode="InProc"
4 Z) H7 k$ r/ n3 N
stateConnectionString="tcpip=127.0.0.1:42424"
; [( a1 p. q4 M6 g, |2 z
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
* D+ I8 Y& _6 G" P: j
cookieless="true"
e7 C/ @6 k5 |) H y
timeout="20"/>
o r! ]: P6 D2 v# s9 \, m
2 k; M; ]- d* l1 f
情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
/ p" l/ G3 t9 U0 `" ?
情景二中,saved in 进程内
: V8 i3 g9 y1 {6 T
设置mode="InProc"
' K9 ]3 S+ A0 H2 `* O9 `! I4 J- [
优点;保存在本机内存中,无需跨网络,访问内存速度快
6 ?6 R& \+ F1 H3 p, {( U' r& [8 }
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
$ I" ^6 g- V* } i' c$ c+ Q9 J
+ D' z9 Z5 t! T3 r2 _
<sessionState
1 T7 Y! `' {" ?+ w. |
mode="InProc"
4 e9 R" p* i& _& g6 ^: g
stateConnectionString="tcpip=127.0.0.1:42424"
; o# n4 W9 a: M9 I
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
0 Z% z" m, A+ J2 w- u
cookieless="false"
' e7 `" y N) X5 ^
timeout="20"/>
$ s0 V9 M2 b3 `) m& B
" B1 l9 O% ?1 M: o# {% u
情景二中,saved in 进程外
1 O( n; X4 Z# J( W) D
设置mode="StateServer",启动asp.net状态服务
/ x3 p9 V# Y F% X* s7 |
定位注册表
, d! z0 Y- r4 f4 ]. W. ^
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
& `' N4 M0 l' P1 t! N
注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
! f; s s: }) B2 a8 x1 G) m
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
: U8 m# g! p; A" W) ~
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
: h r8 m# |0 H5 Q) m. ^
如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
8 W+ j$ s5 \9 G4 b+ X: ~$ i3 z# W
不管你的状态保存时间设置时间有多长,一律失效,
: S. l6 y/ F5 T/ l/ T9 a; |
不信可以考试试,^-^。
3 _$ ~. p8 D5 q+ Q8 F8 B
7 C" B6 w4 o6 j( A& H! @" g2 Q M
<sessionState
% W) M+ W2 t" \
mode="StateServer"
* S' `* ^' Q3 Y; s6 n$ {
stateConnectionString="tcpip=127.0.0.1:42424"
9 Q7 t* d( V0 ?6 L/ ]
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
9 e* W! P5 l& S e6 t5 a
cookieless="false"
1 g! @* \9 I' q# y! I
timeout="20"/>
& k; _1 w7 t0 T3 ]6 v6 h8 S' @
: T7 k! F' R9 e9 p0 Q' ^" R
情景二中,saved in 数据库
3 }7 y. h5 a1 L! h' v7 M. h2 L3 ~
设置
- p3 V+ n3 l6 s
mode="SQLServer"。
' \0 p' i1 @/ l# r2 D$ y/ x: l
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
# ]2 N+ u9 S% i
启动SqlServer和SqlServerAgent。
! Q' N1 p4 a4 P% n
定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
8 M# f0 F& V! g3 D
执行InstallSqlState.sql。
# ~. E" `$ ]) C+ y; s5 [0 }
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
; f7 o# R! X. V! y; W- N1 s( Q
存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
/ U7 M; g& |' ^# u( @
实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
( d* k$ }1 E( q# b- |
发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
/ V- G, F5 a: \/ B8 c
- v2 u( A) h9 ?( B! c; q
新建一个Asp.netWebSite,按F5,一切OK。
+ d! `' j9 a) b; b
效果图形
* g A! j1 X. r0 @) O$ p6 Q% |
两张表
+ C7 H, @ o6 y# @
[attach]429[/attach]
- _/ N8 ~+ V ]! K( \
ASPStateTempApplications表的数据
$ ?' D( ]; \; i
[attach]430[/attach]
% X- b' Z- d- w* K
ASPStateTempSessions表的数据
B! P6 G, @- @
[attach]428[/attach]
. n0 o0 h, k5 P% N/ Y+ a
ASPState_Job_DeleteExpiredSessions作业
- Y/ x7 |2 Y g& A9 h; G
[attach]431[/attach]
. @% n- Z: {- C; I
8 M% ^2 Q4 @7 I. R$ m
需要注意的地方;
9 W* U% G2 z6 O: U; {, |8 }# _1 n M
+ U& o9 z9 O6 o, y) }1 [
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
0 P% ^$ ?+ a) [
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
0 D# E. K# e1 K5 c) f" p! Y. L
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
1 O; ~9 l5 b# I" l
5 ^9 m/ `" v( {2 _, y# M% n8 p
结束
# t! ^$ e6 h: O* D! n6 K; d
写得不妥之处,请多多指教!
作者:
Star
时间:
2011-3-4 17:10
EB_EXP中直接用的是
+ d1 V1 S" {% F7 W- D( ^
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2