晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 # H* y- \$ `4 X. z
$ W% q6 ]2 `' _5 s
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。1 ]3 J/ o) h* w3 S; Z: h% J2 h2 B
    进入主题。+ S6 Z, ?8 Q* \  B" S- b
* [1 i9 }( E0 T
情景一,Session ID在客户端的状态
& o6 w2 T% W5 l5 ]0 b) _        情景一中,saved in cookies情况
/ R' L. f( S$ y0 }7 P, k        ID保存在client端的Cookies集合中0 |4 P6 e% L4 \  @, u, j* L* d
        缺点是,如果client端的cookie被禁用,那么ID无法保存
5 d+ [5 r  w' N        设置cookieless="false"
3 j' e5 ]" z" i/ ~8 O4 B6 [7 K5 k* Y  j
<sessionState! h2 Q. ]# A! N  c# f8 N0 O" Q6 |
mode="InProc"
# r" |3 t& n( E& n5 EstateConnectionString="tcpip=127.0.0.1:42424"
( O, a2 N  W! h  T" M6 msqlConnectionString="datasource=127.0.0.1;userid=sa;password="$ x* b  e7 U# E% C
cookieless="false"
. m* L, L! z0 G9 }1 atimeout="20"/>$ X& u+ N5 s, b) E3 W/ L' k4 u
# s+ _, E( j, f% H0 M
        情景一中,saved in url情况
0 }# A7 s. G% ^& C8 u- q/ e        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.5 M8 D) O8 c8 T
        设置cookieless="true"4 O/ [6 n7 y) T3 u

' Z- q, @6 A- B: U3 Z<sessionState
# c' P7 L  \! R+ _! b( Q    mode="InProc"7 v1 Z: e* M4 K
    stateConnectionString="tcpip=127.0.0.1:42424"
7 G! n3 d7 @4 E3 r: h0 M3 O( d; s    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
/ ?7 o1 c+ F0 ]  H! \$ }( D- d    cookieless="true"
7 p9 U9 t6 V$ _* ~0 I( K    timeout="20"/>* x4 l; O' o8 Y  I" T4 Z

, d3 v) g& w" d  Z       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
/ G- o6 k) a( J! Q( J" L+ {            情景二中,saved in 进程内
$ I+ }, y$ L$ A1 n            设置mode="InProc"7 T0 ?, W" \% l8 S
            优点;保存在本机内存中,无需跨网络,访问内存速度快
9 ^2 n' ~$ e+ p            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态, u: r5 n; S1 B, x

) k& y4 n& |" D0 {) o" l! @  _       <sessionState) o/ `4 G- f  d+ _. A! ?
            mode="InProc"$ U$ M4 G; I# n4 z! d7 i
          stateConnectionString="tcpip=127.0.0.1:42424"
: J/ Y9 q  Y/ C) m" O1 x& I7 p            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
$ Q/ i1 e5 n" j% j. O  w" R            cookieless="false"1 [+ g1 e2 _) |$ h
            timeout="20"/>  L( p( t, H* }. r' V8 n) [' ^( w7 h

" K, n, a- e, r+ z  n! [' P  ]           情景二中,saved in 进程外
6 L; `0 h0 U0 f" \4 e# r$ S           设置mode="StateServer",启动asp.net状态服务( T; r0 X* b7 W& a  _* q
           定位注册表# k  d1 p  Z+ ^0 n- |2 s* {6 }/ ?; }; N
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=424246 v+ {7 X1 [6 S7 m7 A3 {( W( ]
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
: q0 K, J. H( K           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
; w7 U  [# i1 a: _           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
! m; v+ ~" R/ P* L           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
% P1 S; A7 t* c- D. v           不管你的状态保存时间设置时间有多长,一律失效,- s* V6 L: [! }
           不信可以考试试,^-^。
* H+ S9 ~- [% W7 E' {5 U9 e- X$ B
    <sessionState. g) u) I; p8 |( k8 i! o7 E0 S
        mode="StateServer"
/ I$ S) y! s/ J) P        stateConnectionString="tcpip=127.0.0.1:42424"
! ^8 H* N- l' x        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: i! l4 V$ `6 p) `) F% N( a3 Y        cookieless="false"1 l6 b, I! C& T. F7 C
        timeout="20"/>
  J0 O( N; t, I, q4 @3 U# {9 F- |0 S
2 K7 T8 R. C4 }- f       情景二中,saved in 数据库
& [0 r4 C! j- O* @8 p6 D       设置
1 G& A6 C; v: S6 }2 }' V       mode="SQLServer"。5 M, v. N. C: f0 J, Y! x: ]
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
4 W# X! n3 d( @- _8 F       启动SqlServer和SqlServerAgent。4 t, w, t; C' S! V5 }. T( U
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。% u2 \5 A: W0 R' U# f: t
       执行InstallSqlState.sql。
3 j! e( N  v$ p, Z* w       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
- b' J9 t! y' a9 k& l       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,) _/ C; Q# J, |2 i; y2 J" _4 V3 y
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
- V  j3 |" B- z4 J. w- ^       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。5 V0 J4 k2 t) i6 a. p5 \# w3 m
$ L" }: K# W: K7 r$ e5 d  m
新建一个Asp.netWebSite,按F5,一切OK。
: h$ \& P2 V' }4 R+ O( C* `) x效果图形 ; X, g2 a4 v+ l# U. s7 F( C! A" F2 \
两张表
# o* {: d$ e8 _4 L- {3 {. J
9 f9 c# }; S4 {" r" w) \9 c2 oASPStateTempApplications表的数据
  N# S% V5 l: t1 \! g4 L6 @: g3 q# |5 j$ e6 y) f  Y2 k
ASPStateTempSessions表的数据
% K0 A6 f+ [/ ^0 D# o0 i! E1 M! [4 R. l- @: ?, }
ASPState_Job_DeleteExpiredSessions作业/ Y2 x. M6 M" K) _  h( X! K

9 o- H" z$ |! U& b! j/ T
, W# T  J: i2 I0 U- D& _" d, h需要注意的地方;
, B+ Q5 A! L6 Q0 W+ J' F, B! m" Z7 b* M( w  U
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
/ y/ |0 E- T! d$ x+ t' [9 @二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。) C9 Z: f8 @' A, A6 z
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
1 n" M  r5 b# ^& P
) t4 K2 B  v( B+ P结束
9 j, p+ E# S9 x* d9 K    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-12-12 22:01 , Processed in 6.064065 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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