晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑   i' q! Z/ k" e/ K

) l1 B, O2 a5 z0 k* I. w关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
" L+ w8 p9 S3 D! ?  N    进入主题。8 L% S' l" y4 v3 U
- b: Q3 q. S3 p$ Q7 Z  o8 \# c9 N" \: n
情景一,Session ID在客户端的状态) f8 ^: @% ^4 E1 a; U; t% d1 l
        情景一中,saved in cookies情况
  O3 ^# {0 h1 g9 V  g  n        ID保存在client端的Cookies集合中
5 K! {: B& e& X        缺点是,如果client端的cookie被禁用,那么ID无法保存
2 W  x4 g( ~4 I$ V        设置cookieless="false"6 f. d! V& j, ~( B& k' |, i

  E1 V( z) T, M<sessionState$ U* s$ O4 V9 I) L+ e
mode="InProc"; W+ c9 w2 Y) h. [3 b
stateConnectionString="tcpip=127.0.0.1:42424"
! B/ d" V) k7 PsqlConnectionString="datasource=127.0.0.1;userid=sa;password="8 D, q1 p1 h) S) x
cookieless="false"
/ G' d- U, H: H" m, r7 `( Otimeout="20"/>% O, j- a# D, p+ ^

# I4 @% X3 A- h  Q( j7 r- f        情景一中,saved in url情况
; Q0 g  _+ B  Q. y* ~! [        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.! L/ e2 W+ {# _) Z1 b0 a1 Q  p
        设置cookieless="true"# N' b, B7 f5 X& O3 I

. o( {1 H% G9 _! v<sessionState
4 V( H! B; ]" j+ i, _" z* _    mode="InProc"1 _3 ~" T7 K) z4 w9 H9 [
    stateConnectionString="tcpip=127.0.0.1:42424"
& y+ C, R% o9 ~& c: K    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: r% _# e, F! X    cookieless="true"
3 G: u" E& I! ?    timeout="20"/>
9 H$ K1 A- Q0 v$ X) i& ^$ `/ I  b
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。7 p9 v$ V# L. k
            情景二中,saved in 进程内6 r+ g) j7 m9 D( {
            设置mode="InProc"
, M: z9 D% v/ E3 s            优点;保存在本机内存中,无需跨网络,访问内存速度快) }8 u0 |8 O5 I
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态7 l5 G& l2 q) B* ^: b
( e1 R' w1 a9 v' f1 ^/ ?
       <sessionState6 ?3 z8 ?8 r2 Q' R2 f& D+ O# k& \
            mode="InProc"
4 U- F# ~* D. m# l# f0 h/ _/ f          stateConnectionString="tcpip=127.0.0.1:42424"
- g' E( h) A0 `, }2 A7 N            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
) ?" }+ Y3 }& k* b4 @) l. M            cookieless="false"  v( t3 H5 d+ Y
            timeout="20"/>* r0 @& H' h; v

0 _; R+ k2 e; |, t% J) D0 n           情景二中,saved in 进程外: V7 G5 X! H) r) Z8 p* P" _# Q
           设置mode="StateServer",启动asp.net状态服务
0 N4 G# C+ B9 s; H  S8 l) J( N           定位注册表
0 @* k1 L. M7 e( J' w4 x" }            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424240 A# e. t. C' v4 B9 u0 y7 O
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。  {. S: ^, h! ~! j" A0 z
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
8 N! a- z% l" e9 t$ M1 X           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
2 l' H1 [7 H3 K           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,& E1 X$ N& j& \7 a
           不管你的状态保存时间设置时间有多长,一律失效,
( k8 {, f, ]: T. B; a3 p8 ~           不信可以考试试,^-^。- S( u. s/ }3 g% [* m% m" Z3 r4 r
4 r( _0 m4 J: _& Y4 V: ~
    <sessionState) }3 L6 i' d$ l4 {& t
        mode="StateServer"
& D! d, I3 Q/ D/ C7 Q        stateConnectionString="tcpip=127.0.0.1:42424"2 v% @! R' w3 k0 z% `
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="7 J( d) @: U, x, d/ T2 C
        cookieless="false"! ~1 B. u; j6 C" B1 m1 k& h' @
        timeout="20"/>& Q! G) h8 L4 B- n/ I( R4 G0 @+ Z" s
! b; W- x! S( s; ~% t0 K  r
       情景二中,saved in 数据库
2 Q7 d& }5 a7 r7 J/ ]3 A       设置; U$ j5 ^/ d* v: H6 J! g5 U  f& o' p
       mode="SQLServer"。
' h; ]# G9 @. i& a, T; x$ R9 b       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。* j0 w( X% I* T) {4 k
       启动SqlServer和SqlServerAgent。
. X, f$ d, O0 o; E, c       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
; \  X9 x" P- c7 X3 k; h' t; W* N       执行InstallSqlState.sql。+ o1 j, |$ ]. f# x' _
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中) c/ G% q* E5 @
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,) H$ v3 y' ^4 ^& b$ l" K
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
* T( J0 t# A( a' G       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。9 s* `/ q( {5 N( S
; C6 g2 \% }" J% s% E4 z( p
新建一个Asp.netWebSite,按F5,一切OK。! L" ?  d% ]3 Z4 [4 f- x, U( }8 N
效果图形 ) U7 E$ z% V5 Y8 F
两张表0 |; F# R: x, E5 Q2 g: M
" ]9 ]8 Z- O7 b+ L% \
ASPStateTempApplications表的数据
8 L! z2 K4 E9 M  d+ ?5 `6 [' M) q5 x9 U* ~6 X
ASPStateTempSessions表的数据* u! _% N  |7 L7 o, y5 v

* p- ~0 D) `; s$ CASPState_Job_DeleteExpiredSessions作业1 q4 T- u3 q7 B' U2 v. N
# k7 l. W6 T% M5 Z- h' s
8 n2 }# ~0 d) U3 F4 |3 z& U& I
需要注意的地方;
* I* o6 j$ C- w1 Z
5 z( H9 O$ _- `0 x- b; L8 M; K一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。& R2 K; i. k! Q: k  f# w5 y
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。0 t( p/ e4 R' c$ n
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
1 }% K* L! w2 `. J! V4 E6 p4 i5 @* U: Y
7 r  t  B5 {- e+ P( T) z结束/ K/ k) w0 ^: G0 h7 X
    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是
5 ?7 P; h" L- h4 F<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-13 16:15 , Processed in 4.549513 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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