晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑 ! U$ F0 V9 s5 Q4 ]8 s6 X
2 {0 {* ]  Q6 S4 T
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。& \% `/ C, z% q8 c
    进入主题。
( |) x6 d! ^$ k* _( J! a# U8 [! O6 b6 U9 Q9 J# `# y
情景一,Session ID在客户端的状态
+ u; {3 r5 j+ ], Q. g- n- P( g2 N        情景一中,saved in cookies情况
) |2 n0 M' Q& Z( @        ID保存在client端的Cookies集合中
/ a# B4 s4 f' L        缺点是,如果client端的cookie被禁用,那么ID无法保存9 s- P  U( {# _3 S2 u% S- }
        设置cookieless="false"4 i' `  v0 P3 {! a- ^

6 o. |  I' T8 P" R<sessionState2 I9 Y+ s1 C5 `7 c: Y8 }0 k2 G
mode="InProc"
, d, z, E6 G; Y+ o$ c8 {stateConnectionString="tcpip=127.0.0.1:42424"
7 q: J4 M, R1 H, r& zsqlConnectionString="datasource=127.0.0.1;userid=sa;password="
6 O2 _3 _6 C4 B" |cookieless="false"2 U2 Z+ w& X3 j: x# @- P; b  k
timeout="20"/>/ D$ u, A  {% E" s, B. A! e

; A; I: Y' c! }; Z9 V2 }& V        情景一中,saved in url情况
: j( u) a1 d' N/ H        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.) P: b; v4 Z' F% S
        设置cookieless="true"8 R# t; n% U. A

8 [1 j8 y7 P# I& r  V" w<sessionState3 ]7 D8 F, T5 T2 O; f
    mode="InProc"* m9 N5 m3 ]8 O* X
    stateConnectionString="tcpip=127.0.0.1:42424"4 S. l- Y( h5 o+ U) p
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="! w9 l( f" m% U* X( W
    cookieless="true"
8 ?# [0 z, K: h0 ^6 l2 v    timeout="20"/>9 K5 O6 g- t, u" l% B6 h0 U
9 U  G9 ^4 M0 _. a
       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
9 t% _5 r$ I& W            情景二中,saved in 进程内
7 Q# W, v( n/ e            设置mode="InProc"  e4 U+ |1 Y$ R
            优点;保存在本机内存中,无需跨网络,访问内存速度快
  t! K( a4 }  A, h$ F8 _            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
' t! u# P- B9 @& H2 n% r1 w
+ u; Q( v- t' L1 q0 k# H) V       <sessionState8 h8 ]) \, ]0 R! g
            mode="InProc"
3 K3 {2 _4 u* f- \- N' D/ U5 L          stateConnectionString="tcpip=127.0.0.1:42424"
$ E& ?9 u) e. b+ U+ c+ @2 {0 B$ T            sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
; B! ^6 A% e: _            cookieless="false", b. D, N4 E0 j  }, j) Z
            timeout="20"/>9 w, U  l3 A( n% T. P+ R

2 U: B& g$ a% @% g) Z$ `           情景二中,saved in 进程外0 l! U( x* b! Q! `$ F
           设置mode="StateServer",启动asp.net状态服务- X( |% O. u# Z' }3 D: F/ j
           定位注册表
" g' U+ B/ M1 C            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
: D$ Q! u  u: O3 ?* ^8 e8 i5 c7 ^           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
  }2 U* M' G9 S; s5 i           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
' D" H1 f7 K' N; N/ k/ l- V           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",3 ^6 o7 [- c+ A$ q( o5 F) V7 z$ U
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
8 M/ ?- m; x! I           不管你的状态保存时间设置时间有多长,一律失效,
4 L: E$ F% X3 u7 h* K           不信可以考试试,^-^。( \1 R; u6 N: Y! D8 K$ s- k0 W
% g0 \* C( T/ y# x) x$ E& q! H. Y
    <sessionState, Q  W7 o! `# \- C  A) t
        mode="StateServer"2 Y/ |5 u7 e3 k/ n
        stateConnectionString="tcpip=127.0.0.1:42424"
" _' W) @+ [9 h4 |/ T0 X! z* R8 {- a        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
) |" L1 f& Q8 N/ @# Q6 W8 m        cookieless="false"
4 e7 ?8 _, b2 v6 k! \        timeout="20"/>' t! ^% T  c9 g6 O8 j- I
2 o# ]6 T/ Q. C2 A" |7 c) n, C
       情景二中,saved in 数据库
: v% @9 r0 [8 z6 w       设置
( W2 |& |* \  b0 g" T       mode="SQLServer"。
; s* U# ~1 a$ a       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。- L1 g: j1 ^0 `+ V9 [
       启动SqlServer和SqlServerAgent。
3 k* _& L: K6 B0 f, s+ f5 d3 x2 n! o       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。
1 T8 c" |" u5 ~. m, ]       执行InstallSqlState.sql。
5 U5 T  E! _4 J* J2 ?0 A* A       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中+ y9 V) M) l9 I. A  [
       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,2 V7 @' f& w3 K9 z; T; d! x
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
7 K- j6 {: |% u$ Q) i$ }# \* Q       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。; E4 [  _# m7 y
/ Z! I8 Y! x$ [$ e$ d) D* {: K5 I
新建一个Asp.netWebSite,按F5,一切OK。
, Q0 h$ v0 k2 t& ^6 C8 ~5 a) f效果图形 0 K, ?" c  s7 r& z- q! A
两张表
/ I# f/ V, J8 z0 r
) [) I: ?0 d& o" `ASPStateTempApplications表的数据
9 B/ [& o/ B) S) V5 N
0 ^3 I; H$ ~9 Y, S8 aASPStateTempSessions表的数据
" Q: a. g$ g' w7 D' i9 ~1 V6 s9 z( e$ e& f
ASPState_Job_DeleteExpiredSessions作业
% c- h' T( }4 P
+ }8 y& C4 }( B0 O3 X2 N
% {2 L  Q5 A$ b/ P  }* ^需要注意的地方;. Y4 L8 Q- F) s/ Y/ T& d, E
0 ], w7 l0 u( Q
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
! E, ]5 N# D7 J4 f二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。5 u$ l5 V: ~/ u- x. _
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
, S+ N( S9 E1 `5 T" j; s& E  w7 C. _3 L/ ]8 y8 i
结束: D7 l$ G% R- u+ d8 V! n
    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-6-21 05:18 , Processed in 6.063709 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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