晨鸟科技

 找回密码
 注册
搜索
查看: 9238|回复: 3
打印 上一主题 下一主题

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 ) A; X( e7 H; V# E( W* {
; B7 ~. _# `8 ?& a/ P3 s4 X3 I
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。4 r7 q- [) F) R, H, q
    进入主题。6 m* S( Q% ]( [8 n" s1 ^% D1 t

" g0 V; ^9 @+ A* o+ \! ~情景一,Session ID在客户端的状态
' l3 W7 q4 E" w: u3 G1 c' h        情景一中,saved in cookies情况6 T# s3 n! c6 i1 |3 V, i
        ID保存在client端的Cookies集合中
0 {9 `# Y+ R% \        缺点是,如果client端的cookie被禁用,那么ID无法保存5 [6 i4 K! J9 N( i( C) E7 T
        设置cookieless="false"' ^* V* W8 I; ~4 c
+ o( O6 Y- A4 k* m8 o
<sessionState3 M6 i. T& w. B7 H7 D0 g2 d: u  Y
mode="InProc"# m* ^' M5 s" A1 x; e
stateConnectionString="tcpip=127.0.0.1:42424"4 K! X, p" c9 \( V7 |* `
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
7 W, E6 C( x* Pcookieless="false"
: e( E2 K: z" O6 utimeout="20"/>
" @" l, @9 v, V9 M/ g$ S7 T8 D# Z& U* `. A; s
        情景一中,saved in url情况  ?( w  B0 T. x* ?( i5 U
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中./ |5 y- k/ q0 Y  K: a
        设置cookieless="true"; l* y( o$ V8 e- }6 h2 H# L
; I! i: {1 W: D  K& ^; M% k
<sessionState
" ^% O# J$ F$ M    mode="InProc"
+ P/ F& [2 b" x+ N5 }; V    stateConnectionString="tcpip=127.0.0.1:42424", ^8 W/ T( J4 T3 ^: k5 u9 d" h
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="# ~5 k4 A9 x1 u0 w# X$ q" c
    cookieless="true"
* O# n- `( [2 N, l1 C6 R    timeout="20"/>: `; [/ L# S1 ]: {
+ }8 K0 o  v( N, [* u" p! p2 q5 Z
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。8 @. W2 Q0 x' i) E
            情景二中,saved in 进程内3 ?- r/ l8 R, f7 V) Y6 G
            设置mode="InProc"
: E) G" I$ E$ x- f4 q1 W/ Z            优点;保存在本机内存中,无需跨网络,访问内存速度快1 n5 c$ {1 A5 `3 r' |0 X
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
: I' \/ n  ]' |4 l9 i% q" k- K8 X0 c& K
       <sessionState
6 `) B1 G/ e/ {1 w            mode="InProc") C1 x. e* l. v$ V  w% p) U) h( t
          stateConnectionString="tcpip=127.0.0.1:42424"7 F7 l4 p$ ?( z; ^/ g# ^% [9 E
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="$ F8 x/ C/ {" n7 z: V6 ^; Z
            cookieless="false"
- ^* `, R/ @4 s            timeout="20"/>
/ ]6 a7 I2 }2 i
. h; }3 p8 j/ ]$ [2 ^' f* h: H           情景二中,saved in 进程外
# O. U) d' R$ I0 V+ X. P$ z           设置mode="StateServer",启动asp.net状态服务
5 v! ~. C% c* W8 m           定位注册表+ q) _% M' b' c' e
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424* }& ]; o- _5 e0 S4 P# Z$ _
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。# `9 \" ?0 b$ g
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。# V# M$ |! p, v& H
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
6 F) p0 T' X- e           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效," @1 P; a' W# c- j7 J; u+ u
           不管你的状态保存时间设置时间有多长,一律失效,2 [7 m/ l% v1 y; [
           不信可以考试试,^-^。
5 m/ c5 Z, i7 f' Y, ?% V; z' D
5 n( K& m$ G5 \- o% ]) i4 O9 l: b' g    <sessionState
: m8 s7 m1 m9 J# F. }        mode="StateServer"
: g+ [. C* {* x' \4 F/ h2 y# [/ x        stateConnectionString="tcpip=127.0.0.1:42424"
, j' j  z0 N+ x! }8 i7 G3 c+ M        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="8 `7 p' R3 y: U, {, P" d# B4 e
        cookieless="false"
8 ^7 k0 }' g' M$ h8 D+ j        timeout="20"/>, \" D. C  B, n+ z

! ~$ ~( T1 ]. u3 |5 @       情景二中,saved in 数据库$ X# D7 v. x) s
       设置/ A. h6 o$ H0 r/ F& A' Q3 \
       mode="SQLServer"。/ v6 a& p# l/ d5 k0 v8 r: V
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
* T$ Y  y- G# d' |1 P       启动SqlServer和SqlServerAgent。7 L5 \7 t2 ?9 V9 l
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。' }; `- A' i( u3 ^, i! K, G1 n
       执行InstallSqlState.sql。! k# ~2 \+ q+ |) F& l" e
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中- v7 J5 k( n# b: u  N0 n% w
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,' n# A8 o7 p  _4 b5 M. N
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,$ `6 m" y: ^1 G; h* b" S' T5 |
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。) O% d% a4 T. f' A: W& v! ?

; u' u2 [8 z0 g4 R1 @6 O新建一个Asp.netWebSite,按F5,一切OK。* @! v$ y$ {4 M8 N
效果图形 $ u3 G+ t) j! g$ ]
两张表
2 q- U- t& d8 A4 e" z: s
) r8 a/ ~/ o! U  ]5 n. ^3 ^ASPStateTempApplications表的数据, J9 J4 j8 }; i  V) ~9 A" U% d

5 k# u/ q% x* s& T4 P6 pASPStateTempSessions表的数据  B; p! s/ V7 m0 Z  l
5 B) |; K& N. ^9 p0 {9 ~
ASPState_Job_DeleteExpiredSessions作业0 c* `- P2 \2 g9 g
1 n/ \$ V! Y' }' J. z1 g" k/ [) ^

. _4 f2 t- h2 x0 w. l  G" u  n2 X需要注意的地方;& h* G3 ~! v" k) R6 N7 b( m; h

8 q! \2 R/ f: d# g一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。" k- j1 d" A* ]( P# |2 `- W
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
8 n: ^, q4 P/ b1 S三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
1 p1 T5 N; {: r) U$ }0 ]  a
+ b, I0 K  U. `8 G结束
5 k/ x3 S6 h3 ^7 W( m4 @* o# [    写得不妥之处,请多多指教!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是0 y6 }0 y( O  y# `
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|晨鸟科技 ( 沪ICP备09012675号 )

GMT+8, 2024-5-19 12:50 , Processed in 6.065662 second(s), 10 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表