晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 0 G% Y  o' }# V* [. q& Y: |
5 |8 h- o, O$ G! P5 m! x, P
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。/ b% z; s- x! E3 z0 |, P
    进入主题。
$ S) s: B6 I! d
6 \, M  t8 r+ O; a# K情景一,Session ID在客户端的状态
+ `) e4 Z# A) [* R        情景一中,saved in cookies情况6 Y( ]+ w5 T: n: x" P4 j
        ID保存在client端的Cookies集合中
, Z4 Z9 _6 u- O5 _4 E( q9 [: o2 e        缺点是,如果client端的cookie被禁用,那么ID无法保存
2 L( e$ t; E9 J        设置cookieless="false"
! s' t6 P2 [+ O, j3 a4 H1 N9 q% A2 x9 ]% K
<sessionState
( \& q$ d. ]/ u) p0 A; P2 \$ Xmode="InProc"% a7 X. D  @2 S$ Q! T: r9 e# F* z
stateConnectionString="tcpip=127.0.0.1:42424"
6 h+ D( k) f" hsqlConnectionString="datasource=127.0.0.1;userid=sa;password="8 I8 ~( \6 v; `/ z8 g" i1 X: I* m
cookieless="false"
4 ~" w  X$ ^- i2 L3 Htimeout="20"/>6 C: E/ ?; ^7 |% l( O* i

0 ~; o/ P1 |& g: U7 r5 Y        情景一中,saved in url情况! N$ C8 d+ |: q. ?0 X' [2 C3 @: \5 `
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
4 U% W, K6 L/ l- o& G( q        设置cookieless="true"
2 E4 X3 Y9 S; F, Z1 @
) E! J" j. j/ x3 T5 |$ m& P# e  J4 S<sessionState
& ?2 R1 V' X* R8 r1 c* a    mode="InProc"( _: l1 J" `" Z4 V2 H$ ^2 w: H: X
    stateConnectionString="tcpip=127.0.0.1:42424"
* I$ I  k2 u3 V+ q7 m  {( g0 S- v    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="$ [) A% u: W) b+ R: f8 g+ I" O2 v% c
    cookieless="true"
& x* z- V. g& S5 P5 @" d    timeout="20"/>4 ]9 F' M; E& Z7 ~" v4 D4 x! V
  e" p. n. I9 N1 P# r
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
" S4 o5 |0 s' Y& E( X            情景二中,saved in 进程内4 A9 y2 i! t2 L# r0 ^7 t" i
            设置mode="InProc"! B+ i  {3 K$ F2 j. r+ a
            优点;保存在本机内存中,无需跨网络,访问内存速度快
8 m* x& ?  n- \7 E: h            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
( |) d2 [  \9 D, a- E, s8 ~
5 i9 U& |8 Y% J$ e: s# J' E+ e       <sessionState7 w4 d6 z: w& U0 z7 _, U
            mode="InProc"
+ s  O4 |& k4 X' V, c4 j          stateConnectionString="tcpip=127.0.0.1:42424") C/ P8 J. W0 \5 \+ N! m
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="+ v; U  l( l0 C* ~8 D3 [1 b2 t
            cookieless="false"
3 U- I. v+ j! z" S- }            timeout="20"/>) D' V( A) U4 \9 T

% e! ^& [" T5 {" O: ~* M7 ], P$ D+ l) [           情景二中,saved in 进程外  J" e& N' V, K. \
           设置mode="StateServer",启动asp.net状态服务' i4 ^( |! l! c( R& L
           定位注册表( j  l3 F! v9 R2 X5 R. g. {
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424+ B1 C" s; Q3 O' i" j
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
  s2 P/ X- R2 l& s5 V# w5 q           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。& J  K% C4 T: D6 C' t+ Q- k
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",+ ]4 f3 w% O0 ~
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,5 A3 ?) u; h) q0 |& c
           不管你的状态保存时间设置时间有多长,一律失效,
( W$ }5 [) V. n% u) w% v# }2 }6 |           不信可以考试试,^-^。
9 P8 C' H" K  i- S5 F, [' [! ~0 Z) h! a2 j  m
    <sessionState
& Y" s/ o6 M! e7 _4 l% W        mode="StateServer". J2 V$ P3 N5 l1 k6 R0 f
        stateConnectionString="tcpip=127.0.0.1:42424"# X) n" w- Q0 \- }  ]. w4 j& L
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password=". ^5 ~2 o5 [! I; m  E* r9 H' R
        cookieless="false"1 N4 v9 n. L! _7 Y0 e" w+ f
        timeout="20"/>; O6 m5 u: U7 m8 X

+ u7 r' U6 R/ g- h' V       情景二中,saved in 数据库; E: h0 r3 ^: l1 W; D# \
       设置# \  n* I' X5 K4 h& j
       mode="SQLServer"。
4 ]/ e  ?* X8 o' c. ~       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
9 Z6 z0 Q9 O% X       启动SqlServer和SqlServerAgent。
( k, [( }- i; N0 C: M0 B# h. I& x       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
: q# j/ Y* z$ G9 t5 n) ]       执行InstallSqlState.sql。8 d  |: a) w  j& N
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
  G9 h1 ]! I3 _0 y4 N* Q4 Y6 q) z# \       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
0 a( j3 I: W' M; d8 O       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
; I# h/ j2 M5 D       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
% @( k& S& g, w( ^/ ]1 R2 [& S8 A7 F
新建一个Asp.netWebSite,按F5,一切OK。' I! ^8 ?# s/ {5 z1 Y
效果图形 # b# A& t9 U& q; u( }2 @/ b9 ~) }
两张表
+ g3 n( i# z7 D' H. p" A/ R 3 |. z- C# O* A- p* U: ?
ASPStateTempApplications表的数据7 P# q3 U; p3 _5 e/ V& B. `
) C' w, v+ _7 Y" @+ r! s9 U4 m* @" O+ E
ASPStateTempSessions表的数据3 J% e8 z+ X5 s, y7 ]5 Y1 T* i* p

9 w  K8 {+ j/ G% l& `8 cASPState_Job_DeleteExpiredSessions作业6 ]1 b; {5 |( W

, v6 [( L: D) G* B6 R* a0 a5 q0 I/ \- ^; V+ X2 g) N
需要注意的地方;
7 P* F* \5 t9 f5 I$ t( {2 J3 a1 d. g' d
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
! j1 V' G( [) l7 J( C& p二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
6 ]+ k3 A4 T4 d  Y: g三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"1 ?. f3 I  l' S& D& @0 S

5 P! m7 j4 m$ e; Z: {! R# X结束# R9 h: M" `; {8 I
    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是+ H8 d; `; c* S$ l. g" \
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-16 16:54 , Processed in 6.069924 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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