晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 1 g5 j4 J/ \/ {1 f
, u) s' |7 E6 o; H
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
0 \% y9 E% B7 u  G1 \& o    进入主题。
* H5 q; J; E* Z0 c7 k6 A4 a0 z
0 c" _0 s/ D: V9 U' W情景一,Session ID在客户端的状态1 X, Q& s) |. M! y" C9 `% x( L
        情景一中,saved in cookies情况
9 z8 V. I8 X3 {5 l+ U1 |        ID保存在client端的Cookies集合中/ l# r9 S8 P# p8 ]9 t2 Q) d! o
        缺点是,如果client端的cookie被禁用,那么ID无法保存8 S" R( K7 e) d7 m  J8 `0 s
        设置cookieless="false"
. \5 h6 x4 H* s0 m  W+ ]/ x6 E6 @: `
<sessionState; |: [' O3 L: h% B) k, p3 Y$ x
mode="InProc"
. o9 d2 f+ N$ z' X! T# PstateConnectionString="tcpip=127.0.0.1:42424"% k( U5 Z7 h! i; F2 D
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="6 C2 d3 D, o7 B- ~
cookieless="false"# H! w5 J, e/ `. V
timeout="20"/>6 T8 D7 {6 \* }3 b  p* [

  h- n3 q5 N: t; f        情景一中,saved in url情况
2 B% |* A$ [% @6 ^8 L; ]* \7 z        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中./ X3 p: [7 e8 {2 n) B  ^' U
        设置cookieless="true"
9 O9 E. i5 H- ^& e$ z
  ?7 G6 H& {# _1 K  n+ x3 H<sessionState
+ P: P. S" k! w7 ?" C4 a    mode="InProc"
! \0 }" W% g1 T. T5 i7 ]& Q! ~: [    stateConnectionString="tcpip=127.0.0.1:42424"
5 A; W" `3 z8 C& h+ W    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
: ~3 T: s& V, @    cookieless="true"
: `4 q& i, {) O- B7 v    timeout="20"/>* E6 X! _, ]. H1 n1 X8 Z: v5 K

) q4 q4 Y3 L* x9 N       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。9 H3 c" n+ J; r+ T3 X( S" t. o
            情景二中,saved in 进程内
8 m- o( P% k+ ~5 D            设置mode="InProc"
6 q2 M: R, R  L3 |            优点;保存在本机内存中,无需跨网络,访问内存速度快
8 i2 D, D' x7 q1 `  L            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
2 m* w  |! p- E* [
' s" z7 z0 r" T! p' R5 t3 n, J* z       <sessionState/ O& R/ w- I0 Z! R# v. ]
            mode="InProc"
9 S2 Y* o( _9 ?, ~( s          stateConnectionString="tcpip=127.0.0.1:42424", A1 A4 u( @) T7 X
            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="& d4 k" E/ `& Y
            cookieless="false"
7 Z1 J' O+ \$ J+ l9 H" {# s3 O            timeout="20"/>
9 E4 |' ^. b5 B: t: m
6 }, `1 x1 h8 e5 a5 o' A           情景二中,saved in 进程外
- b2 _; ^! A" M  X0 a           设置mode="StateServer",启动asp.net状态服务: O6 i# c  p+ m& L" j
           定位注册表
+ L% T4 p0 T! _            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
+ m3 d: j0 n; y5 L           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。( P# b  ]; E1 z3 u+ {9 b4 ?# A
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
4 U5 L8 c$ i4 F1 \. e, E           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
- v+ |8 I7 [* r; Y& K% Q           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,) e. G$ D# m; k! y1 B, o
           不管你的状态保存时间设置时间有多长,一律失效,
% [* o4 R4 K, o" h! R6 |. b  e( Y           不信可以考试试,^-^。
! o- E" a7 w  _: `- ]( `' q+ g' Y
; g" N( _# |6 B. V    <sessionState/ |8 w3 C& p! i* m" b
        mode="StateServer"; p4 N7 L# K7 r9 q. J' d
        stateConnectionString="tcpip=127.0.0.1:42424"
9 ?+ z$ K6 ?# v1 }        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
- r: z4 g6 V/ c. {        cookieless="false"; _- S: @7 D$ b/ K
        timeout="20"/>- @& b2 x2 S  P5 ^( `6 t

. b0 }; r) S* E       情景二中,saved in 数据库
+ Y& j9 t. q- [  j( R       设置
) J5 u6 X- ^% J3 j, |, ~       mode="SQLServer"。2 t6 N5 ]$ l+ p% n" D$ t8 U' o
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
) U6 V4 S5 D1 O* _) Y       启动SqlServer和SqlServerAgent。2 M7 U) \& I0 K- x( f* @
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
. T  w- K$ s- e5 O" C8 m6 w0 x$ j( E       执行InstallSqlState.sql。, G; R) ?& E; z
       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
7 O+ H- _  J, U. U       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称," ^5 P- M  _# }  n: T0 u/ Q
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
1 t4 n1 x% M( M/ l" S       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
0 ]/ k! E2 n/ X: h9 p) _1 y" Z9 z' q7 D: K" X
新建一个Asp.netWebSite,按F5,一切OK。
6 x0 N6 q' W3 A2 Q: _5 w5 {效果图形
# U: a$ {) @) n3 \7 v  H两张表, I& f* ^$ S2 ?6 H- h) U9 R
% {' F+ `+ K+ b9 k% `
ASPStateTempApplications表的数据
0 A+ L9 T1 \: d$ S; S) r
3 z( \1 q) p( C- W& yASPStateTempSessions表的数据. p6 }" y/ Q8 m( s' g; u
$ ?1 E! w8 M( x' T% R
ASPState_Job_DeleteExpiredSessions作业
" g. l# C$ N1 i+ n8 t5 @4 R% a, V  f4 c
% f& @5 e" [! ]9 I$ q7 M& s
需要注意的地方;
4 s8 I1 A) o+ O
5 d% V& o1 d6 F6 A* B+ @2 S" J一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。+ ?8 [$ @+ `  _& F
二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
+ K+ a3 Z2 `: R, d三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
' U3 w' y6 X$ u: |$ g4 V5 n- a3 J" i" n2 d3 y5 o  S% k
结束
7 @6 W; W' T9 [% o    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

x
沙发
 楼主| 发表于 2011-3-4 17:10:52 | 显示全部楼层
EB_EXP中直接用的是
% ^; ]( e+ Q# D) E1 B<sessionState mode ="InProc" timeout="40"/><!--40min后用户没操作,则session过期-->
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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