晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
( ~3 g) h( W. o; v+ _% J
4 L- g4 d9 a5 ?% a; k关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
9 N& R" x3 k# z7 f$ b; J    进入主题。
! Z" o2 t& ~7 C" `: T/ W0 y) {; s* j6 k. u" C
情景一,Session ID在客户端的状态
3 b4 K2 [$ V* f; W  B- q        情景一中,saved in cookies情况
- C3 H5 Q; l! W" Z        ID保存在client端的Cookies集合中
* P# G& s0 p1 P/ V, F8 D, o# j: J5 {; l        缺点是,如果client端的cookie被禁用,那么ID无法保存
4 O1 R( ?8 U$ H0 }$ C5 C! V* F        设置cookieless="false"8 z1 Q$ P% x" B3 U. r
$ s: g, [6 k" O5 a
<sessionState* Q% k2 A+ V7 T  _
mode="InProc"2 b: L: A; j) P/ C* x( e, g) i% s
stateConnectionString="tcpip=127.0.0.1:42424"
$ ]9 _9 A/ B' C. `sqlConnectionString="datasource=127.0.0.1;userid=sa;password="' |# ]9 ]7 G1 J; ?
cookieless="false"
1 n0 l. _, v2 x2 F) l7 utimeout="20"/>
6 R: Q% [' f* v0 u8 g! S- c# |! H% A, {+ f0 w5 Z1 u% h
        情景一中,saved in url情况
4 X3 \: r2 x& U7 E3 m/ y4 R        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
8 C7 u: d% `5 U. P        设置cookieless="true"
) \& }4 K( C: Y6 l/ R( R
; j1 U0 n3 s$ r- X* N<sessionState
! Y* y3 H3 n; c" E# |& n    mode="InProc"
7 G1 [, ^4 K8 m* k, F0 [    stateConnectionString="tcpip=127.0.0.1:42424"" P. J* V6 \4 I
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password=". j% G0 W& O+ W3 e
    cookieless="true"' ~' h0 z, C5 D9 x$ Q2 J
    timeout="20"/>1 n5 C' u  E3 N+ f7 N
" R; i! J4 o" j& l8 I9 g
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
: |. {, l: v" [: N* r. ?& f            情景二中,saved in 进程内: R6 z5 s+ |% W# ]- _* M8 c) ?+ @
            设置mode="InProc"! g- a$ t4 [+ u; m9 }  o
            优点;保存在本机内存中,无需跨网络,访问内存速度快/ `! v8 v, Y2 I5 d/ h  ~8 j, z
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
/ o: P1 A& Y, x9 L( z9 V
  j6 X; I/ j. b9 g% J$ |- o       <sessionState4 e5 B( N4 _9 K1 M& R, U0 y
            mode="InProc"  I" V* j* `6 N
          stateConnectionString="tcpip=127.0.0.1:42424"
1 N3 g$ _4 K7 a. n" {" [0 [            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: c9 S5 ^: J2 D7 f- U' T            cookieless="false"
9 E" Q# z0 ~6 r3 \* W' t4 O+ P            timeout="20"/>+ P$ I0 z4 t9 {
$ E3 J/ g1 V: X" `( v( |
           情景二中,saved in 进程外
! y" r% G+ \2 s/ u7 ~( E           设置mode="StateServer",启动asp.net状态服务. e! p  ]4 w+ m, {: a
           定位注册表1 n. n/ N/ H' k% J* Q& S' I3 o
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424248 \# f+ b1 \3 k0 G* J5 U
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。  a( z) q' y2 Y  W4 c" f4 b6 {
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
8 Q" |) V. v# A           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
) w# r/ l' ?1 I4 G7 C! j1 N7 y! F9 Q           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效," q3 c" U( A' G# d# |- \
           不管你的状态保存时间设置时间有多长,一律失效,
: \2 J- P" S- P- w7 {7 Q/ @           不信可以考试试,^-^。2 h  F' `3 J: D( [9 _( `

) R% l9 p2 p; Z- M+ g& b* t    <sessionState0 c% X0 P: Z5 g
        mode="StateServer"
4 N, ?0 j9 `) q; w: h& p8 o& j        stateConnectionString="tcpip=127.0.0.1:42424"* E8 [% {( f4 L
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="+ T7 K4 E: ]7 n: ^
        cookieless="false"2 ~# L- H6 }, V
        timeout="20"/>
2 A: a3 T: p' M: P3 ?6 R; n
. A/ _5 @& s5 n  c1 [) `' A       情景二中,saved in 数据库
% s( I/ t) n8 R% _+ y& p       设置
4 }. Z+ U+ }2 W2 q       mode="SQLServer"。
5 H7 V/ q* g3 t       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
1 P! ^, N% L2 @       启动SqlServer和SqlServerAgent。
0 ]0 ]" h4 N* d4 O5 [* l       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
$ y9 V/ \. G* d. W. [* U! a( X       执行InstallSqlState.sql。
' A: B, q+ v- e0 @6 D       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
) k) T/ Z& g" y' E: A/ i       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,' c8 a( _0 S7 a0 I) a
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
. J* [" Z% V, k       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。/ X3 g& ?+ j, j+ L$ A
3 w, x) L  [, P3 Y) _# B
新建一个Asp.netWebSite,按F5,一切OK。) r) ]8 h1 q* C. u! U
效果图形 % r; \+ a" u5 K# G7 P* @% f
两张表1 H. J% I8 Q- s' k
  i0 E8 p4 d& r7 l. ?' j# t
ASPStateTempApplications表的数据
; s% f* [# o7 S" j$ E% y* o8 y, m* a7 v
ASPStateTempSessions表的数据6 M4 b! |7 p6 m9 g& W

8 V" q9 f  q* f& ^3 K- A+ x$ iASPState_Job_DeleteExpiredSessions作业
5 F; i7 f* a) ]
9 a, c5 ~* A! t
" o- y3 ?( m/ p; o, x0 z( S$ y) Q$ e需要注意的地方;9 i; R6 }: ?4 x; v8 R+ O7 g$ w
7 l- f9 H2 A" U  @0 @. [
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
7 |( r0 z3 R6 z+ R$ F二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。, S, t  E: _3 U
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
7 \7 u; k/ o) a% v+ n% _0 }: ^4 t$ A0 \4 f
结束
: [$ R$ I; `6 |; N$ N" Z: v- H0 a1 i    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是) L' Z) M# X* o# \6 ^
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-15 00:27 , Processed in 5.043162 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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