晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
/ k$ T; x% M6 p2 s6 k( s9 o5 I) E# f! S" P0 f! {2 q8 C0 C
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。0 P  b( B' q# }$ F* r
    进入主题。. N. H7 c9 x' {

8 R: H! G( O0 Q( Z) D+ r情景一,Session ID在客户端的状态
3 H% x0 j7 y* z+ k3 Q2 F9 Q8 m        情景一中,saved in cookies情况% t) C; M& y# Q6 g1 [$ m. P
        ID保存在client端的Cookies集合中
! U& m1 f  l$ O$ p9 g; f! m        缺点是,如果client端的cookie被禁用,那么ID无法保存
( Z* B7 C6 `( k, z& _6 P- y* A        设置cookieless="false"+ B; q! q( O; j  }! v" C% q

+ \# T0 k& ^/ K# F( s) J<sessionState
! [' L' y% i9 ^5 \: h  J$ ymode="InProc"
  Q& p6 K$ X+ bstateConnectionString="tcpip=127.0.0.1:42424"1 N) e+ ^% `' v& H! }  Q" N
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="/ R/ Q' p4 M6 V1 S2 w; S4 q9 T* `
cookieless="false"& w: ^8 U9 Y' A7 k( K
timeout="20"/>0 i" U/ U" ~+ k: ?' `7 O
. |  s% z; D7 Y8 X
        情景一中,saved in url情况+ P: s4 Q* _, _
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.4 v' T# q( R) }8 a* x2 N: [/ _  V6 f7 W
        设置cookieless="true"
2 ~8 Z6 a( Z6 ]+ ?. A5 Y
) q  W9 Q9 _/ x+ ~<sessionState
5 f" a2 ^$ s; T5 L; P' G    mode="InProc"1 N) r- X$ h4 a9 U4 c4 C4 j
    stateConnectionString="tcpip=127.0.0.1:42424"
$ R2 t  k" W" L5 z  {0 v    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
) U9 E, T3 ~% f- i% D, L    cookieless="true"' B9 G+ X% k' w' k; f* j, c
    timeout="20"/>! k4 V5 B! t- {: M+ O0 ^

9 F8 x2 a: }& a, F       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
8 _$ Z% y/ b6 S3 K            情景二中,saved in 进程内
8 b  Q$ ?% V$ x/ b6 Q' l" c            设置mode="InProc"
# X7 y- h2 W( O/ r% [            优点;保存在本机内存中,无需跨网络,访问内存速度快
  K! j9 s" n. S& H) ~            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态; V7 q& ~7 f% c# R: A2 m

, }* J# ^7 B# G" E7 `       <sessionState4 _0 ]5 t8 p) V& x
            mode="InProc"$ D$ T/ L! @& F& U' k4 t8 ?; _
          stateConnectionString="tcpip=127.0.0.1:42424"
5 k8 c0 `; _- m2 b            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="3 `4 q+ b6 p# M3 E5 u
            cookieless="false"' Y1 g2 S+ M  Y6 p
            timeout="20"/>2 z' Y; n7 {' m! Z; o
; l; l" R1 g' c, B( T5 g
           情景二中,saved in 进程外
( ?3 O( [  o$ w           设置mode="StateServer",启动asp.net状态服务# y; k1 N7 a; k- s2 V% w
           定位注册表
1 U" U4 F- v) r2 D$ ?            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424) u  G3 U1 N' U" g- W% ]5 T
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
8 U  D- F' W8 Z! i3 U% U           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
8 M% O2 J1 i/ Z  x* U% V           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
9 Z% A% }3 {3 u: J8 i  l0 j% b" `           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,2 n0 E% e" ~: F; D9 a/ h9 H! T
           不管你的状态保存时间设置时间有多长,一律失效,8 Q; v7 V' G! |9 M4 n
           不信可以考试试,^-^。
* R! d, Y# R" a9 G! G( @3 |9 i, G$ B8 x+ @5 g) v( S6 ~: D
    <sessionState' d9 x" ?% j' y+ l9 K
        mode="StateServer"
3 i/ o" i/ L: n; C! M) d5 c        stateConnectionString="tcpip=127.0.0.1:42424"0 _' v0 E7 a& z; N( g  `8 c
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="' w. w4 N: K; {& l4 ?
        cookieless="false"& K" [4 C) n. u4 L& H' [/ f: ~& d
        timeout="20"/>
1 `7 z5 b8 a" e2 m$ N1 G
! D0 O% r- ]1 L6 d+ A       情景二中,saved in 数据库% W) M) N  D- \$ a/ r0 F
       设置
; [* t& P9 U9 o& v       mode="SQLServer"。7 K9 p7 i1 B; h
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
& w+ q: z+ v, ^  E1 R$ J/ F5 \       启动SqlServer和SqlServerAgent。; x, ^+ w' R6 [$ h! w
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。; K& V- ^$ l7 g( T) f6 y) o
       执行InstallSqlState.sql。
' R# s* [* m7 @( N; i       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中( V: E! N- v( G( f* V  R3 a
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
. Q. z1 s+ R4 \, j2 _       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
' n' Z5 a6 n+ w& `( N       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。3 c( |7 B! K+ A  n. \: Q
2 L& t. m6 Y5 y$ `
新建一个Asp.netWebSite,按F5,一切OK。
) c' ~9 O; {, M效果图形
; ]9 [, R# G% a% g两张表
+ T5 f/ M; C( ~. s% e  j . l) y. g( e- E: |
ASPStateTempApplications表的数据
+ A; f2 u3 }# H/ ]- p& K: ^! W
3 ]$ O7 O" y- z- SASPStateTempSessions表的数据
+ s$ x3 Y4 K& ?8 D" M. W+ s
! _% M5 q) E% ]) O2 _ASPState_Job_DeleteExpiredSessions作业
( N) c" I- m  Y- t- y- ?
' v% y1 ^" N; a0 B& W
/ o5 t' v. X* k2 |) G, [- U需要注意的地方;
# `8 P5 a8 S4 C& J( e* T- u; L% l  k& Y
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。$ Q. Q2 n: v2 F  F+ U. K- X/ P
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
& ~  W# B# ?( d  d  ?" ?三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"6 R7 W+ _2 ?9 V  A2 Z$ h" B
- _" ^- J2 W' b
结束) e6 ]( ~( L# K
    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-2 22:15 , Processed in 6.071523 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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