晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
, m+ M" N/ H" e; K6 w% N4 \# n) |. {% [7 O, ^
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。- Z: b0 [+ u+ J1 V
    进入主题。
! B7 F6 s9 b' e, h3 |3 r) l3 j, G" P( x* ^. ?: j
情景一,Session ID在客户端的状态1 h6 a. `9 V0 `( [2 I
        情景一中,saved in cookies情况- Q; [& a- _# ]
        ID保存在client端的Cookies集合中
0 f7 f* I7 H% W$ `! L2 V# U  a: Y        缺点是,如果client端的cookie被禁用,那么ID无法保存+ B/ n0 n1 Z3 H
        设置cookieless="false"
: i& T. P8 q) l+ `# _8 D# @# l
) ]8 G" z: E7 J" H<sessionState
9 ~0 Y2 `* `/ v4 Q" Umode="InProc": @! X" q% z. }" V0 \
stateConnectionString="tcpip=127.0.0.1:42424"' F" |; x+ h, D$ @, F$ G+ N
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="0 R/ h8 ^9 b, c+ ~
cookieless="false"+ t: \$ w& o% d6 [' X$ o
timeout="20"/>
: B  H/ t6 Z0 ]1 d5 T2 G! @4 G! t% z$ A. ]6 M. H* p) m
        情景一中,saved in url情况
5 T4 u0 g1 _! v) K7 I2 Q        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
, C4 M, N( t2 a$ }+ v        设置cookieless="true"" ^- h4 S, W' f- U
6 f4 E; {% R4 z! X! G& ~
<sessionState
+ k6 R: @6 D" L    mode="InProc"- h4 R! W5 T$ M0 V7 D) Y) u
    stateConnectionString="tcpip=127.0.0.1:42424"* p1 Z5 G. w1 r
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
! u! U0 l; p8 P0 P# j8 ^! p; c! {    cookieless="true"
* Y% e# J0 j* m4 C$ x    timeout="20"/>: @8 r# W8 J; O
( S  Y0 k; f" `
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
+ `0 s8 M/ ~3 D6 a* L            情景二中,saved in 进程内* e1 l- j5 G& {, T" `  O
            设置mode="InProc"
1 S" m, d) Y( _* S& P* P            优点;保存在本机内存中,无需跨网络,访问内存速度快
+ [* a2 D, t* `# l+ \7 e/ u            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
: G  }3 b7 G$ `: W! ?
5 j* O, E" ]! T0 K- ^/ R       <sessionState& l' i9 [1 Q' \9 B$ v9 E& ?
            mode="InProc"6 R- L$ \4 Y4 }4 }3 E
          stateConnectionString="tcpip=127.0.0.1:42424"
  f3 [5 w2 q( p9 u" W            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
) u) c: s" {8 W  R            cookieless="false"; I  H. O- q2 ]: D& [
            timeout="20"/>
/ f& ~3 c. h) j( C/ d9 r  l% F
# I, ]  A# t3 x' x2 C" I           情景二中,saved in 进程外
* L- Z5 Q) Y' c& t+ L; i, D1 n1 i           设置mode="StateServer",启动asp.net状态服务
0 x8 T8 ?  _4 b! S           定位注册表
+ ~+ Z* x9 a) n- f" h6 A            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424: u2 T& O8 S% {) W" K; q+ W
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
4 ?4 |& b+ e2 x7 ~, q* t$ W, ], i" w           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。- [- D9 Y+ U7 M$ m. a! d
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
  f- O8 N2 I% K# w2 u1 \9 j           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
* P5 e) f8 K" W, j6 H8 Z           不管你的状态保存时间设置时间有多长,一律失效,/ b3 k6 e3 X5 Q& I& i: N* o' w
           不信可以考试试,^-^。) D' }7 L! E, q8 B6 L( q

) R( c* |' j* r; i- _4 f* x% _0 g    <sessionState! L$ r4 o, G2 q" l3 }" a
        mode="StateServer"
6 y  c' m0 m. A) Q- c, v8 a        stateConnectionString="tcpip=127.0.0.1:42424"
2 G* D+ T, L9 S* ~( Z8 v% q        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
- ]  p- X% [( {4 M$ X2 ?        cookieless="false"& b  H6 n6 _+ Z7 c, o
        timeout="20"/>* A0 C% z3 z% ?8 C4 u
3 E8 l8 J+ I( B. @2 a
       情景二中,saved in 数据库5 @+ F% u# [+ `5 X% v0 V
       设置
" i5 Y: O$ t/ r0 u       mode="SQLServer"。
" A3 l/ U6 `( B- [" B9 T       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
% t3 h, S: k, c: \       启动SqlServer和SqlServerAgent。
7 ?6 _1 G8 P5 F& W. o       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
5 F; u% q5 y8 O3 k$ U8 b       执行InstallSqlState.sql。
# N. d& @, C8 J( C2 B       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中: @# U8 H/ e* Z
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,) Y$ f/ \  R4 k, v6 s4 k2 |( N
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,8 q/ e* b$ C" }. A# e* B
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。, W9 O/ X, S* \- j

6 V$ `! d+ H2 U; w' C" A3 i8 O新建一个Asp.netWebSite,按F5,一切OK。$ H% l8 X' J! {, }. I
效果图形
  g+ z$ @) C' I( E+ w) R两张表- e/ V3 Z) l) B/ w

' Y' Z% R: l5 ^4 [' hASPStateTempApplications表的数据7 ]0 k. _$ V& v) k# N: l
$ R/ H% v3 J7 V0 c. T* |& z  H
ASPStateTempSessions表的数据; @) T5 n2 M& h, I

; O$ @) H8 c2 s/ v; h# S( t2 t+ RASPState_Job_DeleteExpiredSessions作业! Z% X( v8 M) m3 q* A3 r" v
4 n" P4 K9 Y" j$ R" Z. ?. i# A. _( N
- f* `% B) J( S
需要注意的地方;
& f. A( c* i! g+ a8 F, o) A! O5 M$ R( R9 d- s& w
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
2 z% O' W- D& g' _% _1 K# E$ w二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。0 ~6 }, U7 }; P1 W* ~
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd", U4 R! m) R' O8 ]9 Z6 D/ H) m, }

  [, o- H2 ~( {/ x9 N结束
& }4 k5 r7 g1 I    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是% B5 \4 ^1 h/ z( _: w. E) d9 f
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-10-28 12:28 , Processed in 6.072498 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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