晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
1 S$ T1 J7 d7 E. ~3 l3 ^+ F2 I7 B! ~9 n+ W. E/ _
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
: V' x" @6 `# A6 o    进入主题。) k7 S# N9 p# w. j

$ N/ D: u% D5 ~; C: B* U5 w情景一,Session ID在客户端的状态
5 K5 o, J- A6 _        情景一中,saved in cookies情况3 y* Y2 h; M( t# I6 Z: d; s
        ID保存在client端的Cookies集合中# e" w. |+ O* }
        缺点是,如果client端的cookie被禁用,那么ID无法保存* X8 I1 B% x0 C7 a
        设置cookieless="false"
& X+ d0 P8 {, y) h- X+ l- X# f' F5 D( T# ~
<sessionState
( w& z% D2 N. P' fmode="InProc"
0 F4 z" l* y7 i" x8 f, h# I7 BstateConnectionString="tcpip=127.0.0.1:42424"+ k- \* K8 d3 H; w
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="  j6 P. H  E$ L
cookieless="false"- h  [) i1 K( J) y( t8 s! B
timeout="20"/>
! l5 x# n4 s4 A
' k7 K7 C7 L8 K3 R% m/ B4 D        情景一中,saved in url情况2 T9 w$ N1 F$ J  z+ f+ Q
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.+ I3 x  y, K" L8 m# e
        设置cookieless="true"' G9 y3 H6 r9 J# O! Y
2 Z4 q) O7 S, s( j4 i8 y1 p
<sessionState" N9 W! ?% o' U- q+ e$ R7 e
    mode="InProc"% }' c! s. V+ |9 t  c7 k
    stateConnectionString="tcpip=127.0.0.1:42424"
' v# q1 U* ~9 x6 I) o2 C    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="1 j. q6 f# J! Y9 R2 F
    cookieless="true") F8 d! ?$ |: Y- q" L8 r4 _' a
    timeout="20"/>
  z5 s8 z6 h& K, j1 p7 U" K7 o. f  t# X9 p, I/ k3 ?8 O0 I
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。# c5 \8 |/ w6 y$ c' F$ @: n/ {
            情景二中,saved in 进程内# y" R9 l6 ?7 D
            设置mode="InProc"& }" \( ~4 A1 q, ^+ q2 ~( g) u
            优点;保存在本机内存中,无需跨网络,访问内存速度快( a0 Q% @( E% ]! T5 L7 y; _
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
0 r7 F/ O5 l, f$ L- Z& L8 a* d! }( F; \4 Z
       <sessionState
3 d; d) y$ m5 {2 ?6 h; {, W; M( @            mode="InProc"- ~  e& J) h8 k; r. C# L' f
          stateConnectionString="tcpip=127.0.0.1:42424"
% f! i6 ^9 e2 c            sqlConnectionString="datasource=127.0.0.1;userid=sa;password=") ^* h  \& |: V6 q
            cookieless="false"8 R2 w  ?3 b, I
            timeout="20"/>
! W/ z2 d0 b2 b: r2 z; S5 b+ V: m1 Z+ y2 T7 b
           情景二中,saved in 进程外
. I/ m; M" x+ Q3 v           设置mode="StateServer",启动asp.net状态服务
- Q) Z9 ]3 |1 d& e# L- w3 G! y           定位注册表
& Z8 N& e: p2 M3 S6 d            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424. m4 u" W8 i) L) _
           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。5 X7 s/ }+ t4 [
           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。( g  e1 [- g' w. {1 |$ \3 W
           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
0 q9 z: N' R# ~) E           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
  c. P# B$ z  a# G+ s; Q           不管你的状态保存时间设置时间有多长,一律失效,3 e( [: W; f: W% s/ H9 N; I
           不信可以考试试,^-^。
: Y$ C) w2 Q+ E
+ X$ _2 N, B. m; b  [  \    <sessionState
6 v6 O! w& i7 q7 T# U: v        mode="StateServer"
* x* u% g7 ~. N6 U        stateConnectionString="tcpip=127.0.0.1:42424": W/ }* ?( W  g/ r  a- R+ n
        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="6 ?/ _- Y  [) R3 O5 T; O! G" O
        cookieless="false"
0 u2 }0 F( C2 b5 V* C1 _' \3 e        timeout="20"/>* u% g; Y6 t; c" H
: s0 u2 o+ j% j# C) q$ r/ a+ z9 N
       情景二中,saved in 数据库; Q' m8 m. ^7 L" {
       设置$ ^1 ^3 y# K# q* ?# i/ G
       mode="SQLServer"。
, \) g" @. p: `1 s( _2 C       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
; I$ |! Z# w& ?, E8 n7 I! l2 U$ }& |       启动SqlServer和SqlServerAgent。
" O3 Y. ~0 E1 i2 p2 A       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
2 {/ }9 a' C5 F* V2 V       执行InstallSqlState.sql。
/ M/ P  R8 T) U6 m. Z) t1 E% K       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
6 V, f5 P/ u4 B2 C+ H9 e( G       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,
' [+ l, ?1 \- ^( ]( e2 e       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,: Q/ B. ^. M! l2 N' N$ R
       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。% g0 Y* H3 Y  f) o) J
, D' N6 D# }. f& F6 \) @$ Q
新建一个Asp.netWebSite,按F5,一切OK。7 Z1 d4 |2 g. F- n* u9 Q
效果图形 # N& p- u, ^( h
两张表) M6 W2 f9 q5 `; |& }/ l
1 `: D# G+ k- y
ASPStateTempApplications表的数据5 d& l% ~* P  G: @/ m
9 T$ R; x. l' q' m
ASPStateTempSessions表的数据
1 v$ D7 F% W2 O  }# d6 L
; _$ E: E+ g! t, g% LASPState_Job_DeleteExpiredSessions作业
- j" e7 O* ]  v/ T( S3 y! p' y, M% \. Y, D
( q4 g5 G% r) k+ g# s7 j1 e
需要注意的地方;
; g' K7 C& b# P3 _
; t) I4 e4 @$ K5 r* B  V一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
* R* \7 T* z$ O; h3 t二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
' d' S" A7 x+ U( }- G' d三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
2 h  y0 V5 F. a( V' ~/ ]2 N8 @2 F& n, `' [0 W; x
结束8 v# \. h) ~6 G, T0 E& V
    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-1-28 11:42 , Processed in 6.068592 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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