晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
! ^' H+ T% C5 Q( O! I7 s( m  k0 x( x- `8 e1 l% Q
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。3 i! S7 u* M/ D3 r
    进入主题。
9 _' \; w% D  K: J+ m$ R' O
* Q9 C! I) z* t* ^0 @9 E情景一,Session ID在客户端的状态' {2 |$ V& u, `/ E3 o8 R
        情景一中,saved in cookies情况
7 e1 H# J# {( a; F  P- c+ m( v        ID保存在client端的Cookies集合中+ h9 @4 P; }5 r0 a
        缺点是,如果client端的cookie被禁用,那么ID无法保存
2 `2 U3 y" U; ]        设置cookieless="false"$ b' r* e( u" g" s( D1 |' H

% ?8 m) F9 e$ A8 E  O. k<sessionState
. N$ |; P2 [1 s8 F  l, S8 cmode="InProc"' \8 }# }! g  b* w0 b0 I$ a! U
stateConnectionString="tcpip=127.0.0.1:42424"
8 _2 b: C, @. E" I  B7 q: lsqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: c3 e$ G1 h3 u1 m# e* x7 K0 B; Rcookieless="false"6 C( o5 i9 t9 M: F9 I) b
timeout="20"/>; {1 G  n: h5 H9 w9 ^

( Z: n1 M8 B# n2 u$ J        情景一中,saved in url情况
( W) q1 e4 ^7 z% N2 {        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
/ c7 n, v% L! c% G  S5 F        设置cookieless="true"4 o; E2 D. [; V7 z. h" w4 \. n
5 ?* ~  N0 |& ?9 ?/ M
<sessionState2 Q# i; ~7 q4 z9 D* e1 T
    mode="InProc"
% M6 a6 `3 E5 r  I( W3 I    stateConnectionString="tcpip=127.0.0.1:42424"
) A% d/ ~: Q% T    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
) ^) i% f. W2 D: V- ]    cookieless="true"
  V8 u5 h4 [. H# l  \    timeout="20"/>: I* u$ @8 s" s

+ g; H4 [. r' A5 K, {       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
  s1 r( o8 c: ^( d/ s            情景二中,saved in 进程内% o) W0 ?% D/ _( E4 p
            设置mode="InProc"
8 Y2 ^- a: n' X, }3 P1 H. K% d; R            优点;保存在本机内存中,无需跨网络,访问内存速度快
" K" n" t! }" I- {- R/ Y            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
, [+ ?* r1 G/ t: s" d, ^# v3 G1 V  H
       <sessionState: a% Q0 J# i0 W, Q9 G( v) r# P
            mode="InProc"
. B+ s. o8 {4 N. @! ~4 H9 v          stateConnectionString="tcpip=127.0.0.1:42424"& t8 b0 T5 G' W% ^; e
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
7 ]! Y* G0 s, R. B            cookieless="false"/ ~" R, M; [: H6 \2 v9 b4 Z
            timeout="20"/>
4 h' c" [) }* `8 P# ]; M" f) A
           情景二中,saved in 进程外! B' X6 D" Z. \- g- ^% ^1 J
           设置mode="StateServer",启动asp.net状态服务
- M4 H! Q+ t2 O( l           定位注册表; n/ e% K! P0 i6 N
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424245 D: |, H' T0 ^3 h) _2 n
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
# Y6 R2 ?3 F3 u           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。7 X4 a- n1 W  I
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",* P3 W; p: z& `! x. E% ?
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,, l- ?, b& D" X5 G$ Q
           不管你的状态保存时间设置时间有多长,一律失效,
( @% @2 {9 I9 v+ X           不信可以考试试,^-^。
+ ^  n7 f+ z0 d5 ^1 f2 F
$ p% `5 b: y, J( ]    <sessionState' A$ C* G! M/ Y% |, W
        mode="StateServer"/ m. T5 f9 U  \) I( `
        stateConnectionString="tcpip=127.0.0.1:42424": u  }8 g5 B4 u, c
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: I$ F( ^* x, ^) I( M% V9 J        cookieless="false"
# D( N: _1 `, o  @1 T        timeout="20"/>
% Q. ]& X& Y: Z9 m# q2 `3 M* k# j7 @/ B& s  j8 x1 U) O
       情景二中,saved in 数据库8 z' U* D. K; O6 \  r6 K6 U
       设置
! j) q% b) q3 ~( d& _# J       mode="SQLServer"。+ d1 D( F6 F; P* Y" W
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。8 H! V8 J/ t: k9 E7 F( Q! P& c
       启动SqlServer和SqlServerAgent。
) A* E9 \9 p# C       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
, Q# l  T0 R, O& N  m       执行InstallSqlState.sql。9 L1 z2 o( u- |
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中) q: l6 _/ {4 J  s( Y; Z
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
+ g. [& t0 Q/ h4 d, G  F* D. m       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
9 v" \/ N! o! h4 z       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。4 K/ L' N1 L  f. N* q

$ M/ h# N$ r; Z3 K新建一个Asp.netWebSite,按F5,一切OK。
* ~, ?1 K1 _3 y* T效果图形 6 G. E6 d4 g, ^0 q5 A& ^  f% z
两张表8 J9 c" P8 u7 A8 D

5 l/ W9 ~2 Q- ^+ W4 Y! LASPStateTempApplications表的数据
+ m8 R+ v1 K! z$ l9 g
' q/ Z/ G, @2 }8 p- r6 e& OASPStateTempSessions表的数据
0 m% G% u3 P5 E- v
1 A" Y* d1 M$ V' b5 Z1 ~ASPState_Job_DeleteExpiredSessions作业
3 H5 T  ?- \  H" d. S5 i9 Y% U5 I8 s$ z% x

" O* `5 R5 d6 H需要注意的地方;
' x4 K" m$ y& w
% K  \' M0 I2 Q! z! o0 P5 o一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。& L4 Z' ?; }, P# {
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。: K% C5 x- ?6 h% |  f1 p7 Z0 b
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"( z( m; d3 _: m' @& ~3 F

% z0 q8 k0 I# N, z( D结束
  N# \. i  i2 D4 D    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-3-16 11:22 , Processed in 6.070546 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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