晨鸟科技

标题: [转]Session持久化 [打印本页]

作者: Star    时间: 2011-3-4 16:59
标题: [转]Session持久化
本帖最后由 Star 于 2011-3-4 17:10 编辑
, H  |" r, Z0 U' J4 s6 M# \, N, h" X! ?4 g  w! ~
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
9 Z. H) R5 m  r* t0 d    进入主题。
' x! \* i2 O8 N, L
* U) A: F' E" t4 D. Y+ y/ @情景一,Session ID在客户端的状态  ?' k3 r: g- z  W8 K* y5 }) L3 @
        情景一中,saved in cookies情况
, \! F3 c% @1 g+ [$ R/ G9 d: X        ID保存在client端的Cookies集合中1 e; y; Y- ~1 Y/ a# B
        缺点是,如果client端的cookie被禁用,那么ID无法保存0 ~/ f% T" R4 C' Q' X
        设置cookieless="false"
3 t4 K% ~6 z8 x- Q8 o6 N  p" ]8 p- o6 C9 j
<sessionState6 x3 e2 e( ^4 h" Z' T4 x
mode="InProc"; j8 ?, e5 \) r0 j$ T. k
stateConnectionString="tcpip=127.0.0.1:42424"# y) a5 F5 q$ ?$ q( u) c
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
- ]; z  F1 P& I4 I' Fcookieless="false"
5 R% R* e/ e' n: {! N. U6 B6 stimeout="20"/>
+ c3 b3 C6 _; e" d4 I8 E: V! Q  u: u6 @5 F- W' ~5 |
        情景一中,saved in url情况
" m" X. y% e  m4 b! H8 s1 k' d        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
/ x4 \( \$ U6 |0 p/ q+ t        设置cookieless="true"
3 [) W) c% Y9 W# I% t; ~
# e9 ^1 _* ^. N; {3 m<sessionState  Y2 j6 R! K: \& p" L
    mode="InProc"( V+ u! [/ }; E5 V) j7 z, f7 z
    stateConnectionString="tcpip=127.0.0.1:42424"
" J( K, G8 z& W1 G. S/ x3 ?    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="! @; l/ C% s0 N" _  c) ^+ w
    cookieless="true"% s# g9 ^9 y2 E  m& {- v; w, @5 ?
    timeout="20"/>1 h, g+ L2 s/ u: I8 q, m
" R/ Q& G; c/ O, v9 E
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
$ [9 }& H3 c% ~; q, A            情景二中,saved in 进程内
: E2 [! W: ^6 O6 K, a            设置mode="InProc"
2 V& W% y0 u2 V4 K0 C+ J% O) n            优点;保存在本机内存中,无需跨网络,访问内存速度快
6 _6 i& @0 x9 {; K            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
( j' Q( `1 I3 W* V" \
( w! x" \  }9 t7 o0 F       <sessionState+ O# w+ y+ n& o; k. s0 c
            mode="InProc"
3 W$ l3 }# n5 e' n          stateConnectionString="tcpip=127.0.0.1:42424"
% f+ b; `- S  q6 w# d. i8 ^( y3 Z            sqlConnectionString="datasource=127.0.0.1;userid=sa;password=": s( |; e4 [9 I
            cookieless="false"
' x9 ^9 k1 s7 c, L0 @+ \: B; f3 b            timeout="20"/>$ `, m. g, [/ t' B" P# E; ~
3 ^/ z( I9 r5 n# j3 T, M
           情景二中,saved in 进程外) r- G  L2 k& R$ l* r) B
           设置mode="StateServer",启动asp.net状态服务, u/ w5 B1 ?6 Z/ T8 E
           定位注册表
  S9 A5 Y( Y' R' d" p# |  q7 L            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
1 P1 h3 G( N. ~$ ^. p( J           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。: W5 `9 i8 i7 R! G
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
; S, `' ?3 `" V7 u2 l" p           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",+ C: \+ {- ?  ]1 D' M
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
$ f0 @, m0 C8 ~9 L2 X/ }5 s& {           不管你的状态保存时间设置时间有多长,一律失效,& N% b) [  _9 z1 m0 Y
           不信可以考试试,^-^。# L: ~% a7 l" E! x( g
; B  [5 B& r' D3 N; R. P
    <sessionState' ]3 [2 h: q7 h0 t
        mode="StateServer") o0 P* _, t: J/ n* n
        stateConnectionString="tcpip=127.0.0.1:42424"8 O2 Y4 d8 }) d; h' |
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="6 m& F+ l/ ?2 R; }1 O, f
        cookieless="false"% o& Y# P2 {7 l  w8 t/ Q6 O) w
        timeout="20"/>; ]: `) T- K. P+ }$ {; f" P  l

: S* @6 {1 f, a$ \       情景二中,saved in 数据库1 l1 U3 _! ?7 a# \: m# z* g0 }0 a
       设置) s) n* R5 _6 L3 t( U
       mode="SQLServer"。
7 o& z6 K( A) z& M) c* X* ]! c       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
& I% v, v7 [2 Z" }       启动SqlServer和SqlServerAgent。
/ ?5 p% E1 Q" \5 ]+ u7 g" S       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
: |# z. y+ R  Z) W       执行InstallSqlState.sql。
( [$ F* U# A2 c' B/ d: M5 m       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中9 n& f' F. X) V% s
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,4 n+ l' _# u( A3 P- y0 [: \$ F  m; \
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
; y+ N/ W. h+ [+ I# {- n4 M       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。3 F0 }) z1 |( S) V3 H8 N# O+ E

& ?. W6 b5 _+ l, o$ m. S# s新建一个Asp.netWebSite,按F5,一切OK。
6 P& E0 a4 C: w效果图形 & A, N* G6 k" ^
两张表
( d2 J, ?4 z$ o  F4 q/ x* S [attach]429[/attach]
; n6 ]6 g  q7 BASPStateTempApplications表的数据% G9 L: M) o- q$ u7 n9 m
[attach]430[/attach]
6 J3 F/ l" P9 d3 \. A4 hASPStateTempSessions表的数据; W% e& ]$ Z8 U2 {% M3 b. D* j3 L/ K
[attach]428[/attach]
5 {) S! X2 ^+ ^: L3 k# Y5 c6 k9 |2 IASPState_Job_DeleteExpiredSessions作业: U( Z8 z. \% C' s2 J
[attach]431[/attach]
  H5 g- r1 _; e
" Y; _6 z; r4 P需要注意的地方;
" ]- L# Z& ]( y$ r. x. n) [8 x8 h3 ?  E; L0 _
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。! r; [9 C: ^; I* y8 Y
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
6 \9 `8 Q. C6 C' N& v0 W三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
5 M# J2 H6 ]  j: {8 N8 {
& \4 r8 J7 K& Z+ f% h结束. L' `$ W. O& q+ Q2 e0 Z
    写得不妥之处,请多多指教!
作者: Star    时间: 2011-3-4 17:10
EB_EXP中直接用的是
7 E/ K0 _& {6 B/ r# A9 J% n! f$ v, _<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->




欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/) Powered by Discuz! X3.2