我爱电脑技术论坛's Archiver

白雪公主 发表于 2008-5-23 09:30

编程高手 ASP.NET 状态管理

一般而言,HTTP协议是非状态服务,它不保存任何用户请求信息。直至NetScape开始使用Cookies来保存用户请求信息,Web应用程序有了极大的发展。现在ASP.NET程序员可以使用很多种方式来保存用户请求信息。 _koB'iq
下面主要介绍ASP.NET关于状态管理的几种方式。
,WQ-c rfY5Tj } gd#Ylyb w1Cm
客户端 -s"~9\+m!j"D[(VC eQ
ASP.NET,提供了Cookies, QueryStrings (URL), Hidden fields, View State and Control state (ASP.NET 2.0),来管理客户端请求。 Uz&U%vB6Ik/m@

8A2L&K R*I/^D8o 一。Cookie de O*V'W)^,Z1t(Z#K

;S7WF1b3Mbxo"k-w Cookie是以文本存储于计算机中,使用name-value匹配。一般用户存储标识用户信息,如:用户名,用户使用配置等。虽然Cookie可以被加密存储,但不推荐在Cookie中保存用户密码。第二,Cookie的大小是限定的,所以不适合存储大型数据。 /@#_)UM,\$w sv
Example:
-j;tG$}R"Q"l7v 1。获取用户ID
*x qJI%\l\u:Bef if (Request.Cookies["UserId"] != null)
4wEYanH lbMessage.text = "Dear" + Request.Cookies["UserId"].Value + ", Welcome to our website!";
Q4T-UF-`2K+w else
Kj W sjs lbMessage.text = "Guest,welcome to our website!";
"JZ"jxwO n 2。设置Cookie `exAEI2L
Response.Cookies["UserId"].Value=username;
|l;{o3X%C2qDn 优点:
{Y~9W1`5oS 使用简单 {h `'g8N ~(w\;J$v~
缺点: ([ p_!{C`*j
1。客户端可以禁用Cookie z3DK%X1~4_Xl
2。Cookie在每次请求或发送时都会被加载,影响传输。
h w7D:Hn _"K 3。易被攻破,所有不适合存储安全信息。
:Y|$Os3o? d4Ur8E bG9ZL"|l
二。Hidden fields(隐藏控件) 8k:Z?8Tt
Hidden field是在页面级保存信息。与其他用户标准控件的区别是,Hidden Field不被呈现在页面中。当页面提交的时候,Hidden Field中的值将被一同发送给服务端。虽有在ASP.NET 2.0中,我们可以使用ViewState来代替,但Hidden Fields依然可以用来存放一些不关键信息。 _o2jG)Q X6{7c+x
Gu9{q4Si8[
protected System.Web.UI.HtmlControls.HtmlInputHidden Hidden1; )]7z |r@y

iR/NqW8y8Vs //to assign a value to Hidden field
4a$vF m!_wOp8M6e @O"h jh2T'y
Hidden1.Value="Create hidden fields"; n%] e c S,e@
(q{m%]{({:F `0Ax
//to retrieve a value R|I0f |o
I'`b sza[y
string str=Hidden1.Value;
&\D%~5U!i2k%p5l
i/V6Np*a(WJ
I'Wd pS o 优点: q Rvg7`r
1。使用简单 %B R @;}k,[-|R*m,S
2。可以存储少量数据 JxU5~!BG:|0cl
缺点:
x PI-{!~5E-n/b&m 1。不安全,以明文的形式直接从网络传输
:{z*If| K5@8{l 1p)W-\!d(o0dvf:J
三。View State(状态视图) ^vL,st@

&e5E%C:w1J 状态视图ViewSate,可以用来为单独用户存储信息。你可以通过设置EnableViewState属性来控制ViewState的使用,在默认的情况下属性值为True。ViewSate在每次用户请求或服务端响应时,都会被传输。所以,为了减少网络带宽的使用,可以在不需要状态视图时设置EnableViewState属性值为False。ViewSate在页面中的存储是经过Base64转码的,增加了额外的数据量,所以一定要注意保存较少的ViewSate。
?TD8xL0S*_Id(?
g&r]U8F)Nwa i P
y\j@w~8v6S // Add item to ViewState 5M6DQ(Ow*D~u_T

m(qN8s&O&FwBC1p ViewState["myviewstate"] = myValue;
ZQoR({fRN Q}6|Dh4jc&^6r)`
//Reading items from ViewState G9^(g/_+t-}s,?
Response.Write(ViewState["myviewstate"]); 0dk4^Q!Z:F
优点:
s)] P Jvq~} 9L,GK3A'?1}.L(W
操作简单 Q:@'X\^v
被加密 R.}V%g7s6qC
可以在控件级别使用
%yo;H*lu6` 缺点: UuK7I0I0{!]
9hRO8`g;pA7B A7s
加密编码增加了页面的大小 /s){#{ Y En}
增价了网络传输 I2w$rAE*HT#h

hSaR%o~9n5E 四:Query strings s~|U8SM_*U
L:SJf'cI'y
Query String常用于页面传值。很多浏览器都会有长度限制,一般在255个字节。值得注意的是,尽量使用Server.UrlEncode,来避免一些意外情况,如Sql注入。
;M$^#vH;~1s#H string productid;
_;{AGQuI productid=Request.Params["productid"]
HP b0pv v+`PS3F
服务端
Fk(`+\ejy 一。Application
N,[5cJ-H z)x"lI"o,_ Application在整个应用程序都是可见的,所有用户分享同一个Application。在ASP中,常用来存放链接字符串。 8{'b5p i.` u.V

H9M;hN:W7x:fIT Application.Lock();
0VF'_Na:ki d2H#W~4R
Application["mydata"]="mydata"; nt8cN*?dIH(K;j
1E9Iv9^{H#T
Application.UnLock();
k\WRPSH"ECV4V&_
][+kB-ng8U#j-k(W Ml FY2u6Xo2cf
二。Session
}#qoo;x$?%b Session为每个用户单独存储用户信息。Session有三种存放方式。"inproc" , "sqlserver" , "stateserver。 a:fW]O M
InProc,数据保存在服务端进程中。由于目前有600M的内存限制,可以导致进程重启,而失去所有的状态信息。 |"A1aBho
SqlServer,存放与数据库之中,用户状态可以永久保留。 p^ILs ol
StateServer,存放与另一台状态服务器中。 c-Nd,Oo`:[

;Y!~$B:y8r6E { Session["UserId"]="UserId";
.o$t*Om5O string UserId = Session["UserId"].ToString();

页: [1]
   

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.