晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
* F/ q# V: Z, ~0 I$ X7 N
3 _- x2 f5 Z( t; K7 I关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。" d/ x6 F3 A9 S' B& ^
    进入主题。
: U0 e' I! r, ]$ V/ V1 Y6 _" c! F- s2 H2 z
" T; R- |6 N7 C' v# Y) f# |情景一,Session ID在客户端的状态
* z. r% i# e! U' K( J+ F2 ?        情景一中,saved in cookies情况
* q  ^! S# B& R' w1 u        ID保存在client端的Cookies集合中* j4 C  a  o3 y1 c, I8 N
        缺点是,如果client端的cookie被禁用,那么ID无法保存
+ j. z/ d) ~( G5 k& L! v7 |. G        设置cookieless="false"& E# G; g! C2 n9 l! U) Z# n9 _8 N
0 S, E! y3 z5 E0 e6 o& r$ y
<sessionState
! ]6 h) F2 y- n# Nmode="InProc") D, R" h; E2 k0 t& h. D
stateConnectionString="tcpip=127.0.0.1:42424"
, S& R  d6 n8 ~" PsqlConnectionString="datasource=127.0.0.1;userid=sa;password="
+ u7 Y4 D$ z& S1 y. w) @8 gcookieless="false"
9 Y7 Z& S2 ~$ V, K4 _5 _! j: ]timeout="20"/>
" g- x7 S! w/ m' l: s
# L) _9 S' ^! [5 e, \' H& y" ]: V/ X% e4 Q        情景一中,saved in url情况, c: ^% c( x. p( A) V
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.: I7 c# D9 Y! k1 x  i0 w, Y7 H
        设置cookieless="true"
. R2 `; Z& Y. g" E7 `! E: o: ?& R, C$ Q! @" N, N
<sessionState- b6 F. X  W' i/ s) m; O/ I$ e
    mode="InProc"
" I: h. O: ?, n1 h6 c5 j4 ?8 E    stateConnectionString="tcpip=127.0.0.1:42424"2 S. Z4 H/ }+ {! j, A
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="5 ?* B) U- `1 M& U& O" S' R/ n
    cookieless="true"/ M5 W' x! m4 G8 D
    timeout="20"/>( @9 j) G; ~0 m
: Z$ z* I& K- B& n( g
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
, o2 y5 l& A. p2 C+ {0 z* P            情景二中,saved in 进程内' H9 e! }6 d& ?. h2 Y' \
            设置mode="InProc"/ c" I7 e- P6 a5 E; U) x9 B! f
            优点;保存在本机内存中,无需跨网络,访问内存速度快
* Y6 E7 d/ a8 v            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态# Y  N! i: a$ B2 E8 F8 Z% k$ ^
7 p. L+ K- y7 S9 j. g8 z
       <sessionState
) B8 T+ k; M: i            mode="InProc"0 s+ g( z  Z% Q* V" c0 y
          stateConnectionString="tcpip=127.0.0.1:42424"
2 }6 y; d. {. D" `* }            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
( i. J8 t2 y( ?; d5 o8 P2 l            cookieless="false"0 i& O# R) z: B8 L9 n7 I& R2 l
            timeout="20"/>2 c3 E7 i. ^: x* X+ l& W# p) c

0 h8 o8 x. P0 `0 {& |0 x* Q           情景二中,saved in 进程外
% [/ a. o  r2 p& F5 T           设置mode="StateServer",启动asp.net状态服务# ?- K# A& _: q
           定位注册表  L7 M  X" J2 s" j
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
/ _& z' `+ ^. }7 w  a. ?           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。( P; l4 l" s+ p( l
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
* C0 o* O% K2 U: h! K: W           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",8 R, M& g8 }. n$ O+ F# V
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
& c6 `# Y4 ^7 g* J0 \" P- l: Q           不管你的状态保存时间设置时间有多长,一律失效,/ M% T/ s% z# ?1 `8 l
           不信可以考试试,^-^。
0 p  n1 f3 I) p8 x( R& _5 s/ f# N8 v, M* O8 u
    <sessionState0 d8 Q- z/ e) t
        mode="StateServer"- a+ g  _/ i) E' Z; X! L' j- Z: [
        stateConnectionString="tcpip=127.0.0.1:42424"- p! e8 p6 ?4 y3 @' z
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
. r6 R1 T/ w( ]- }" l        cookieless="false"
$ Q$ i  X# ]  b. t        timeout="20"/>; o4 k: I. {. _1 E3 R4 o3 B$ w
( c! e. d  o1 G6 R: h% W9 c
       情景二中,saved in 数据库
6 }. s5 R  L" k: p  N" {6 L0 ?$ I, I* J       设置+ q) F8 u: v# @6 y! f6 w
       mode="SQLServer"。
8 S& c& u1 m; u0 \       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。/ z9 X; q/ R8 R
       启动SqlServer和SqlServerAgent。
& @6 f4 r* W. w& Y+ K- B       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。* s) ?3 Z$ C( E3 z7 ~* z0 g8 g- Y  z
       执行InstallSqlState.sql。7 r  m  s+ l& |  H) Y: k5 j- e) }
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中. Y. ], Y; \& \- h6 s  B0 K& D
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
* n" t; u! o; ^3 O5 A/ h6 J       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
" [6 w" B6 F! o8 }) l       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。- h& A4 ?8 N! d" u3 l
0 R. r$ U( F/ R8 G/ Y( \9 o
新建一个Asp.netWebSite,按F5,一切OK。
0 i- g& `$ Z; C效果图形
# q, n' b8 M, w" @两张表
2 ^7 W+ R) ]# o3 Q
: f! W! L3 ~. N* Y6 ZASPStateTempApplications表的数据7 F4 @! Y, ^, b% C/ A, R9 {0 }
8 l( s% F6 I  {! b4 U0 {1 n: k
ASPStateTempSessions表的数据
, Y3 i, f$ c3 F) X+ D/ U( c8 E
6 X" V) J5 q. S+ `% RASPState_Job_DeleteExpiredSessions作业
4 n$ @( M( F" F
7 o% {, \" f% {& N. i0 V% L% w
6 H( n8 U1 j' I6 w! c: F0 d& B' H8 c需要注意的地方;
% G2 [; s/ y9 s1 j- {' e6 z; Y
2 Y' @9 J+ D4 h- c一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
* r7 v% d1 L0 B  `- j二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
. V9 ]+ g6 f4 [" N. e0 [4 h: V三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"4 ]5 {, C8 |/ P+ J

5 s2 s4 i1 S" j' d# i1 N结束
, P5 r+ }  d& h( x2 z% Q, @    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 只看该作者
EB_EXP中直接用的是. l- a9 P  u, s) Z$ p, E. z. e
<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 15:16 , Processed in 4.707707 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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