晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 9 @0 i/ M, M2 G7 Y1 ?
4 M! ]8 J1 k& A- ?- W6 @: m9 Z5 @2 [
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
) j5 _' m* P& g7 l9 n) P6 W    进入主题。
1 t8 s: [* L" ?. r+ C1 L- n2 b7 i3 d$ R) _, B+ C% E( m
情景一,Session ID在客户端的状态
$ r& o* V9 w9 e8 o' [5 E        情景一中,saved in cookies情况3 @, {1 ~6 m: l
        ID保存在client端的Cookies集合中" T3 X/ [. N) p# j
        缺点是,如果client端的cookie被禁用,那么ID无法保存
( d- \0 z3 s- K9 \1 v9 y        设置cookieless="false"
$ g: F8 |$ y$ X) t2 _1 N, H+ u& D5 m3 u& t1 Q& o
<sessionState
7 V( ]  X3 M1 T+ P/ K: U9 jmode="InProc"
+ k% g/ D" h- n: ^stateConnectionString="tcpip=127.0.0.1:42424"3 G0 u% E0 M. ]: b6 z
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
5 n4 X. V* L. C: W- icookieless="false"
5 l& Y  R' c* gtimeout="20"/>
1 G  s% c/ l+ T0 H* h  ?3 J- c0 i1 w* U6 a; F7 o6 e
        情景一中,saved in url情况
" p9 n0 `* I: C! O! m        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.' f: g* S! `( g" d3 H. b
        设置cookieless="true"
/ C: b& M3 ~1 _* o+ V( B8 }/ F. f/ B# N. j
<sessionState
! G6 T6 f1 e7 j    mode="InProc"* e& F2 w# Q3 q& u
    stateConnectionString="tcpip=127.0.0.1:42424": L* |- `  D" K) }3 k' Z3 I7 q
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
* Q% ?4 K. m3 M" i; D* I- B6 ?    cookieless="true"7 u  v3 K, T$ \& c" ?
    timeout="20"/>
+ G( {+ V! Q; ]5 H
" f3 W5 ^$ b- S4 ?1 M       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
' ^# y- l/ \8 n* E  Y) o            情景二中,saved in 进程内
8 w$ f- K$ n3 |            设置mode="InProc"
9 y$ t: P& s3 l; K6 h2 X5 G# u            优点;保存在本机内存中,无需跨网络,访问内存速度快
% I! w% H( o* s$ J# _, I3 e            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
! s5 Q' P& Q2 l/ h. Q
. f. M7 ?7 b! d9 j; d& {       <sessionState' P* D" @2 O$ m% m$ C; Q
            mode="InProc"
3 l! H0 W3 C1 h3 ]7 _          stateConnectionString="tcpip=127.0.0.1:42424"+ ^) A! r7 i) e* R. ?- F, P$ j1 l8 }5 K
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="2 Q' z( d0 C3 a' |2 x3 W
            cookieless="false"
/ X6 Y; ?% u/ R            timeout="20"/>+ E& \' S( T$ q
( e1 T& ]  a. C& s; ]2 G" j
           情景二中,saved in 进程外
( P) C& L# A# `0 H0 h" W+ y1 O2 _8 a           设置mode="StateServer",启动asp.net状态服务1 ?; m  T! \0 o' {/ ^( M8 t
           定位注册表, I+ T0 u/ q8 I) l. L
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424241 Y8 D$ }: z/ r9 p6 b
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。) G4 c. P5 ^8 k/ p7 j
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
& z4 b, C' z  D) q           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
; f( A+ \1 q" w1 W/ D9 V           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
: x* m0 A* e9 _" @" c" n           不管你的状态保存时间设置时间有多长,一律失效,* n# d- l  O$ z2 Q$ E- c9 t
           不信可以考试试,^-^。5 K( D& i  R) m" l- ?3 j% u
5 B. u( K: Z7 H9 p3 |
    <sessionState
1 m2 k. y8 w4 l* w3 {$ |        mode="StateServer"$ r/ e! O2 s; C% b& C. m, b8 x
        stateConnectionString="tcpip=127.0.0.1:42424"7 L- {- `7 a9 _# ^  y# V  L. I
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="- V/ X8 A9 d' w) ^
        cookieless="false"9 ], s' Q. H5 R5 p& x
        timeout="20"/>
2 Y4 w8 [+ F" u3 c- c( a! M2 y" {$ X; b7 J/ z; W
       情景二中,saved in 数据库) n6 b3 {6 s: M6 x
       设置
  J8 `+ f: }2 ?7 G. L       mode="SQLServer"。
$ B$ D: e8 V* o       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
# B- k0 ?, @* J! T       启动SqlServer和SqlServerAgent。
/ q' v' D  d2 {1 f" r3 {$ }       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。. E8 }1 k* o3 y3 |2 A' ?% b
       执行InstallSqlState.sql。: S9 _+ S# ?: B1 h
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中/ J" ~2 [5 n, O5 L) R8 O
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
. j! O3 u1 W- v' B& N% A       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,5 `9 i% K8 a+ P$ Q
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。; x6 m- A5 i% |* y8 Z- {* y: i
' a  ^& a9 ~5 ^$ b- v' j, J
新建一个Asp.netWebSite,按F5,一切OK。
% P3 G9 n: j9 h  i$ i效果图形 8 ?9 S, n: {$ k7 |/ |2 t% }& }
两张表* E1 X$ I* B/ h2 i

# D- h# Y* r9 V% [ASPStateTempApplications表的数据0 e1 y) |  z% L- ~
. p7 A8 U% J: k5 b+ @/ X7 V6 w
ASPStateTempSessions表的数据
) {. n3 v  u0 f) D4 y; j* ]! J2 W: L5 \7 ^" z
ASPState_Job_DeleteExpiredSessions作业2 M' C, S, c# _+ w# D

" W0 S& I# w% A2 S+ T* e: L6 v+ [* j2 }: L! {2 v8 E
需要注意的地方;8 K- p8 D5 c/ A7 s
( b# T* m# i2 l# T& G; E" i
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
( t" [( W! l3 M5 R" o: s0 x二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
1 m4 L' e! t: O3 w! |( k/ B三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd", s, U& \) P/ W

) A/ X7 p+ o& j; b3 S结束
. q% w8 k, l0 B( a    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是# Y  E1 v, g5 x/ R" O# y% ]
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-31 10:48 , Processed in 6.070546 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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