晨鸟科技

 找回密码
 注册
帖子
查看: 10546|回复: 3
打印 上一主题 下一主题

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
9 ^/ n/ _- K. ?9 r8 p5 o& V# P
& `; y1 [. m! w& [  C4 m关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
3 L: E: v! k, j9 Y1 d    进入主题。
4 e3 M4 H1 N9 ~1 [
! Z9 }  H( L1 u情景一,Session ID在客户端的状态
1 W' t  q. F" M# s! i1 ^        情景一中,saved in cookies情况
" I5 T* x8 U4 c+ e+ w% k        ID保存在client端的Cookies集合中$ @- ~8 M9 f6 R
        缺点是,如果client端的cookie被禁用,那么ID无法保存& H& m  b' r. c/ J- a) ^
        设置cookieless="false"# p' m. @& i; P( ~0 }1 Z

% c6 v" X0 {* O2 `; A. z<sessionState* G4 o0 i0 N0 s* A" Z9 N$ _+ @* I
mode="InProc"; T/ d0 H- G) K& L' B8 x
stateConnectionString="tcpip=127.0.0.1:42424"- [6 b' `, m9 W, _
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="8 Y+ {* J3 z, c3 j4 N) W; X( U' V
cookieless="false": M; O) l2 a. E3 k* ^
timeout="20"/>
3 j2 V9 g0 V1 c. A/ Y, l/ M  r( v8 z" p8 q6 L
        情景一中,saved in url情况
( K% ]; H) G- W2 }/ A        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.  Z& x. k8 O; D
        设置cookieless="true"& I" b( G) t! j. g, c+ m

+ x$ {4 Z% `+ k4 q4 k<sessionState
/ h8 c+ }# d  d6 [/ b$ D    mode="InProc"( S1 Q- l: q+ g( S7 X5 \% I' t+ V
    stateConnectionString="tcpip=127.0.0.1:42424"
5 m' g0 @5 J& K    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="5 s1 K0 d* Y" D& f4 V- U
    cookieless="true"
8 w8 c, S4 Q: Y/ W" P: g. `. u3 g    timeout="20"/>" G) G/ h& J: o. r

3 w8 y8 c4 `& k6 a4 z" I! e6 o       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。! v7 c7 J; Z6 R! J1 F% K+ y
            情景二中,saved in 进程内
. i4 Z- L& u0 r6 h            设置mode="InProc"
" L  ?8 C( A  |2 S- b$ r& L            优点;保存在本机内存中,无需跨网络,访问内存速度快
, {! V; E& Q! L" {            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态0 [3 K' w2 u$ v/ b6 L

; Q0 L, q1 f$ H; X       <sessionState' R6 w8 X" \( \& r6 y
            mode="InProc"
  A3 Y; M" M% G0 b- j          stateConnectionString="tcpip=127.0.0.1:42424"
0 }! y2 a, L4 E3 h! t0 c# L            sqlConnectionString="datasource=127.0.0.1;userid=sa;password=": l* R$ z8 E$ g
            cookieless="false"
* W; y) q' B9 i0 q, R            timeout="20"/>
4 z' S1 z: n$ s1 h
4 G4 O. v* p# W# L5 U% ^. I           情景二中,saved in 进程外% `( i2 R+ I" r$ L' T+ ^  b
           设置mode="StateServer",启动asp.net状态服务
' z+ g. B  w$ y- ]$ X           定位注册表
4 k" W$ m0 K! s8 E            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424247 [2 T% i" ^$ l$ p4 H( U
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。2 s# C$ C. F5 m, c' h
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
6 ]% q1 p$ o" p) n+ |- {) I5 E           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",' Q/ k, Y& g" ]; X) m
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,- P2 o  D1 O0 T  M' g
           不管你的状态保存时间设置时间有多长,一律失效,. F0 u7 _; x4 i* ?
           不信可以考试试,^-^。( ^& v2 F4 C* D) |% C3 p( j: k1 s

& z- w5 q" h! P  t8 m    <sessionState, ~- X0 Z) n0 W1 c7 z" W+ O
        mode="StateServer"
8 r0 S5 ~. l; O2 j" s2 o        stateConnectionString="tcpip=127.0.0.1:42424"$ T1 j9 {7 h) q$ O6 ]7 L& h" k
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="+ a* m4 N3 Z; e7 I5 r
        cookieless="false"; A( L5 O% p: f) ]' X
        timeout="20"/>
. m4 R- ~. O) e5 |4 n
) J, ~: S9 t! q. [: g       情景二中,saved in 数据库
4 d5 B/ ^0 U7 a# |       设置5 `' I. W2 R/ Y' O1 E& r0 B) i
       mode="SQLServer"。
, w5 ?0 k/ z/ ?2 f, f# Q3 @8 ?( f' t% v       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
( v( G$ E4 S- D       启动SqlServer和SqlServerAgent。
4 i0 X+ I& J3 _" W/ l0 g" ]       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。0 T2 ~. f! |" Q+ t/ C9 \
       执行InstallSqlState.sql。: d/ M; H+ c+ L8 s9 _4 n3 Q
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
. |7 a3 A7 J6 G' d       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,3 K3 m! f4 i0 j% ]- K  K* Z; |
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,; H/ g; I* Y  ^- o* A8 [" [3 y) ]
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
7 |6 m0 a- W8 I# \8 c9 j( U- ?1 Y2 u6 x
新建一个Asp.netWebSite,按F5,一切OK。
6 {/ }- ^: t: K, g7 @: Q效果图形 ! K& C0 K, s  H0 Y! X- n, U$ [( e; }
两张表! R8 l' p# Q& o6 b0 T0 u
8 T$ H8 D* }+ d" S- @
ASPStateTempApplications表的数据8 H$ N) s' ~! h- k9 P
4 T) k1 V( x2 y* J/ ^1 I
ASPStateTempSessions表的数据
* s( W; C/ d, Y4 g- ]
3 f3 ?. `2 _/ n4 ~" k/ a8 k: {ASPState_Job_DeleteExpiredSessions作业
( W6 c* d' @3 v$ n6 g* B+ d4 T4 K5 \. r/ x8 o% {
) X1 k" U, }9 E
需要注意的地方;
" i8 p% b" b  J/ E3 y
' y/ B9 c. p6 W6 I  p' f, ~一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。0 a" m) p3 }# y& Y/ E% `* `
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。* n6 r: w, f8 {! V" }* G3 I
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
2 B) l8 D6 ?% R+ i' b: b6 G" X9 b, h
结束
% G3 [: G% s: x9 u3 Q" U    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是+ _& B3 h6 c, X: n, M
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-22 04:15 , Processed in 6.067971 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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