您的位置:首页 > 编程语言 > ASP

ASP.NET状态保存的常用方法

2006-10-02 15:19 316 查看
[align=justify]ASP.NET状态保存分为客户端保存和服务器端保存两种:[/align]
使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快

的服务器性能,因为对服务器资源的要求是适度的。但是,由于必须将信息发送到客户端来进行存储,因此对于以这种方式可以存储多少信息存在一定的客观限制。
[align=justify]客户端保存的方式一般有如下4种:[/align]
1

ViewState:
利用场合为:在对同一页的多个请求间自动保留值,多用于客户端的一些事件。,典型利用场合为:页面信息重置,

登陆出错次数统计,Grid列排序等。
优点:不利用服务器端资源,实现简单,相对高的安全性:因为经过哈希计算和压缩,并且针对 Unicode

实现进行编码。
缺点:因为ViewState存储在页面本身,所以无法存储较大的值。并且通过源文件可以看见其中的值

,虽然经过哈希计算和压缩,但仍有被篡改的风险。
可存储的类型:string,integer,bool,array,arr

aylist,hashtable以及其他可以序列化的类型。
2 HiddenField:
利用场合为:存储少量页面

中经常改动的信息,多和客户端脚本一块使用,典型利用场合为:客户端经历一系列验证之后向服务器端回发,服务器端从客户端HiddenField中获取值,进行处理。例如

:LeyserHomepage中,要删除一项产品,需要在客户端弹出确认Form,用户确认之后再PostBac

k回服务器端进行数据库Delete操作,当用户确认要删除时,将当前要删除的产品ID存放到一个HiddenField中,然后执行

Form(0).submit回发到服务器端,服务器端再从HiddenField获取产品ID值,进行数据库操作。
优点:不使用服务器资源

,广泛支持,实现简单
缺点:安全性不高,因为它被包含在页面上进行发送,所以可以通过源文件看见他的内容。存储结构少,仅仅支持string,integer,bool,array,arraylis

t等简单的数据结构。并且在其上只存放简单的单值,若要存放多值,需要额外编码。存储量少,因为它被存储在页面本身,所以

无法存储较大的值。而且大的数据量会受到防火墙和代理的阻止。 注意: 使用了HiddenField之后,需要回发到服务器进行

处理,应该使用Http Post方法而不是Http Get方法(通过URL请求访问)

3 Cookie:
利用场合为:存储少量页面中经常改动的信息,典型利用场合为:为登陆过的网站保存登陆用户名,为用户输入提供方便

,还有在一些用户自定义项目上保存用户的个性化设置。
[align=justify]优点:不使用服务器资源,实现简单,可配置到期时间。[/align]
缺点:大小受到限制,一般浏览器支持的最大的Cookie

容量为4096字节。客户端用户可能会配置为拒绝Cookie。安全性:保存在客户端的信息可能会被恶意用户修改或者获取,所以不应该保存敏感信息。持久性:保存期限受到客户端的配置影响。
Cookie 通常用于

存取已知用户自定义内容的个性化情况。在大多数此类情况中,Cookie 是作为“标识”而不是“身份验证”,所以在 Cookie 中只存

储用户名、账户名或唯一用户 ID(例如 GUID)并使用它来访问站点的用户个性化结构是足够的了。
4 QueryString:
利用场合为:

将信息从一页传递给另一页的最简单的方法。
[align=justify]优点:不使用服务器资源,支持广泛,实现简单[/align]
缺点:安全性,因为直接在URL中暴露给用户

,所以有被篡改的风险。容量有限,一般的浏览器都有255个字符的限制。只有在通过其 URL 请求页时查询字符串才是可行的选择。不能从已提交给服务器的页读取

查询字符串。

视图状态:需要为将回发到自身的页存储少量信息。ViewState 属性的使用将提供具有基本安全性的功能。

隐藏域:需要为将回发到自身或另一页的页存储少量信息,并且不需要较高的安全性。 (客户端事件)只能在提交到服务器的页上使用隐藏域。

Cookie:需要在客户端存储少量信息并且不需要较高的安全性。(个性化)
查询字符串: 可以将少量信息从一页传输到另一页,并且不需要较高的安全性。 (页面跳转

)只有在请求同一页,或通过链接请求另一页时,才能使用查询字符串。

[align=justify]服务器端保存方式一般有如下3种:[/align]
存储页信息的服务器端选项往往比客

户端选项具有更高的安全性,但它们可能使用更多的 Web 服务器资源,这可能在信息存储量较大时导致可缩放性问题。
1 Application:
利用场合:所有的请求都会需要的

一些共有资源,由最先的一个请求率先获取之后,拿出来共享,其他的请求就不用浪费资源进行再次获取。典型利用场合:一个股市 Web

站点可能在一天中每 5 分钟从数据库获取大量的金融股票信息(也许是 40 MB 的数据),然后将这些信息缓存在应用程序状态中,这样所有以后的查找请求都可以在应用程序状态中访问这些信息。其结果是极大地提高了每个

请求的性能,因为传入的请求不需要跨进程、跨计算机或数据库的往返过程。
[align=justify] '首次Http Get請求[/align]
[align=justify] If Not Me.IsPostBack Then[/align]
[align=justify] '先判断Application中是否已経有了緩存[/align]

If Application.Item("Database") Is Nothing Then
[align=justify] '若没有,从DataCenter中獲取[/align]
[align=justify] Dim ds As New DataSet[/align]
[align=justify] ds.ReadXml(Server.MapPath("TestData.xml"))[/align]
Dim dv As New DataView(ds.Tables(0))
'拿到之后,

緩存到Application,方便別的进程Http Get請求復用
[align=justify] Application.Add("DataBase", dv)[/align]
[align=justify] End If[/align]
[align=justify] Dim dv1 As DataView[/align]
[align=justify] dv1 = Application.Item("DataBase")[/align]
'緩存到Session,

方便当前进程的Http Post請求
[align=justify] Session.Add("DataBase", dv1)[/align]
[align=justify] End If[/align]
[align=justify]优点:易于实现,全局范围。[/align]
缺点:持久性,若

保存数据的服务器端进程被强行关闭,那么数据就会丢失,所以利用Application一定要有保底的策略,有的话就使用,没有的话就自己拿。耗用服务器端的内存。
注意:因为Application中的数据被多个进程公用,所以若需要更新其中的值时,需要利用

如下的语句,做到独占更新:
[align=justify] Application.Lock()[/align]
[align=justify] Application.Item("DataBase ") = NewDataBase[/align]
[align=justify] Application.UnLock()[/align]
2

Session:
[align=justify]利用场合:单独的一个进程内部使用,存储单独会话的短期的、敏感的数据。[/align]
优点:易于实现,持久性,可以应对IIS重启和辅助进程重启,

可在多进程中使用
[align=justify]缺点:耗用服务器端的内存。[/align]
3 Database:
优点:安全性。 容量。 持久性。

可靠性和数据完整性。 可访问性。 广泛支持。
[align=justify]缺点:复杂,性能[/align]
方法 使用场合
应用程序状态 存

储更改不频繁的全局信息,这些信息由多个用户使用,此时安全性不成为问题。不要在应用程序状态中存储大量的信息。
会话状态 存储特定于单独会话的短期信息,并且需要较高的安全性。不要在会话状态中存储

大量的信息。在支持许多用户的应用程序中,这可能会占用大量服务器资源并影响可缩放性。
数据库支持 存储大量信息,管理交易,或者信息必须可以经受得住应用程序和会话重新启动。数据挖掘十分重要,并且需要较高的安全性。

[align=justify]如上备注[/align]
[align=left]ChengChuan[/align]
[align=justify][/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息