晨鸟科技

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

[转]Session持久化

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-4 16:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Star 于 2011-3-4 17:10 编辑
" @3 d8 M5 D  z# Z) K% R* H$ d7 E6 g* x
关于Session持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。
; O4 n2 g+ _9 `" S3 H8 U    进入主题。" w+ u2 U$ l# v* L& J7 F2 q5 v

9 T8 L1 ^. [% g情景一,Session ID在客户端的状态" A" Y: g! O, y% x$ w5 z
        情景一中,saved in cookies情况; R. a( |; \# i" i% f* g
        ID保存在client端的Cookies集合中
( g. e4 ]& ~2 W/ f/ H' b6 y4 I0 a0 Z        缺点是,如果client端的cookie被禁用,那么ID无法保存
% A: K8 O8 E1 |: u+ m6 B        设置cookieless="false", ?9 w+ R: g8 r% d, N1 p: Z2 |9 H

" w- R/ G. t: N; I! K0 l( ^<sessionState: |) ^' g8 \) v" N$ E+ C
mode="InProc"- `- M" y$ K8 n0 h! l! ]" M
stateConnectionString="tcpip=127.0.0.1:42424"
+ F% k4 Q9 ]* t' {* O" c4 z- msqlConnectionString="datasource=127.0.0.1;userid=sa;password="
0 I) r& J9 d! Ycookieless="false"
1 }- O3 Y' Q( B' ttimeout="20"/>0 W4 T" N5 X$ W! o+ S; d: ^
1 y2 b* V, S$ i! V
        情景一中,saved in url情况, c- C* w% C3 O. z- h. P6 q4 n
        MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
' ?4 S* q9 U+ U, q        设置cookieless="true"
; y8 b8 s% `* r& o4 [6 h9 Z9 d+ n# q. Y# L' I! v+ C% [
<sessionState
2 p: P( f+ ?0 f! E, D& S: }+ A    mode="InProc"
% A) F7 a- x0 v7 N- E& W: W# X    stateConnectionString="tcpip=127.0.0.1:42424"% a2 z. Q3 K- Q4 {! h1 J8 M
    sqlConnectionString="datasource=127.0.0.1;userid=sa;password="3 P3 p+ H/ `7 u- |; Y2 h  y
    cookieless="true"
6 d/ e0 Q/ ~; \7 e* j/ H) l+ q* O    timeout="20"/>
! E) A/ ]  e3 X! ?: x) x0 \
' T& x; ]2 D5 J; r       情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。( A2 v; e  i# v; M4 a8 f8 ~3 R4 [
            情景二中,saved in 进程内1 n8 ~) ~* D8 j4 [1 Y
            设置mode="InProc"
( C2 K1 ^8 z* c7 n$ H$ h3 D            优点;保存在本机内存中,无需跨网络,访问内存速度快' K1 r4 f3 d1 c4 y8 N
            缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态. Q: \% A# i( M; p  W) j  }  C
+ Z) ^2 s+ Q( e
       <sessionState& w$ m/ M! ^4 K4 A% c( z
            mode="InProc"1 M* t. c9 J, c5 Z# m, M. {% J* g9 R
          stateConnectionString="tcpip=127.0.0.1:42424"
) C" J1 s2 N4 |0 g( t% k5 W$ P            sqlConnectionString="datasource=127.0.0.1;userid=sa;password=": k& ^$ ~% d6 P7 m3 X
            cookieless="false": o* D3 P4 O/ G9 F& C
            timeout="20"/>! q) ~8 [0 _7 ~( n
" p" C8 X* S5 }% I9 `
           情景二中,saved in 进程外6 o  _4 `' @' D( M; ~2 h% d. b' K
           设置mode="StateServer",启动asp.net状态服务  V9 V  r7 I1 }. |  s; T6 o
           定位注册表7 [( V. S6 `) L) N& k6 {
            “HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
0 c, _- n( J: N2 x2 E7 `- k# `0 o           注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
- g+ F( A4 c6 `           优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
3 @: g! U- U6 P$ |/ A           如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",8 b% L  c* F) ~# H
           如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效,
2 B" @' t1 F: B! J( h6 G           不管你的状态保存时间设置时间有多长,一律失效,
* ^. b% e) Z0 ?# O. s+ Y6 z7 `/ {           不信可以考试试,^-^。
/ k) i+ g- e0 J  \0 K" w
6 K5 j& L" E  T) a- f( G    <sessionState7 s4 w! g/ ]' H* ?
        mode="StateServer"0 Q( b# m8 Q3 u* F, `. s2 c" ?' h
        stateConnectionString="tcpip=127.0.0.1:42424"
# B  R5 o- ]% q9 n1 f5 n( C+ T        sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
, \( w5 E8 q( C4 E        cookieless="false"
& M) j# U& Q( t* v0 z        timeout="20"/>: o9 e. ~9 O" A& M+ s
) e4 r/ _# F, g4 p- t% X2 i1 p8 J
       情景二中,saved in 数据库
) Z# ]/ C. H9 e6 b9 O0 A6 Q) y       设置( z1 {( o0 @2 o% Q
       mode="SQLServer"。' h* c! ?$ w# p% X: }; L7 a4 z
       sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。) Q& P: i8 y" H( G* J2 r
       启动SqlServer和SqlServerAgent。0 ^7 m1 Q& q$ i" h0 G( v
       定位到[systemdrive]\winnt\Microsoft.NET\Framework\[version]\。! Q& W  K4 e2 U' t
       执行InstallSqlState.sql。
7 k6 N5 W% [* @! F4 [       然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,ASPStateTempApplications和ASPStateTempApplications表中
! O3 Y% j# y5 C. X; _       存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称,  f1 }/ U8 ]. |0 N
       实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业,
! r* S- {" V$ y/ z" t& d+ M  a+ T       发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
8 S: a- z- v3 r! ]
3 T2 n. s5 E; e% G1 u5 }新建一个Asp.netWebSite,按F5,一切OK。
; d. y# [' X( |& C. H6 {: N效果图形 ! r8 ^) f- J0 C
两张表* Y/ F; {- q: w
0 B& h0 S2 w9 C
ASPStateTempApplications表的数据
2 T7 b$ y" O: r0 P  e- w' k- \" e8 f. g- x0 p2 E  j1 _5 S7 a, c6 _
ASPStateTempSessions表的数据
0 t0 H- V  L/ }9 @9 Z; X& m* Z2 z- N- g( f
ASPState_Job_DeleteExpiredSessions作业& L6 m- O5 T! `9 o9 X
% J% k3 B$ {/ z
0 V8 }/ V2 t% ~- g8 y* Q: X9 O
需要注意的地方;
7 w7 O) I. x9 b- @
4 U  G2 G5 C$ e3 T+ H3 ^- \一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
- Z$ s: K9 M- |; W2 E0 G二,启动MsSqlSeverAgent,用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。# P9 G5 Z2 c! Q5 q
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"& {* P* h$ H" O: p/ l( {

+ \4 T* v1 M. Q, h  l4 l4 l结束6 d  m4 P( R( P; V: \
    写得不妥之处,请多多指教!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-10-28 06:57 , Processed in 6.069569 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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