【IT168 技术文档】之所以用这个题目是因为很多人常常问我研究开源项目的意义,有一些开源项目在别人眼里看起来完全没有搞头,是一些没有实用价值的项目。其实开源项目往往是新技术的试验田,是全世界优秀程序开发者智慧的汇集,如果你仔细研读这些开源项目,得到的不仅仅是这个项目的功能,而是观摩新的技术,学习比你更聪明人的智慧。
我一直研究的一个开源项目是DotNetNuke(简称DNN),也许你不知道这是一个什么系统,不过你不用关心这是一个什么系统,因为我要讨论的技术在任何一个ASP.NET网站里都有可能用到,只是用这个开源项目做示范罢了,不过你会看到在开源项目里,MSDN里那些死板的技术说明是如何巧妙发挥功能。
开源网站系统提供的性能设置选项
在DNN开源项目里,有一些设置可以调校网站的性能,包括以下这几个:
我会花几篇文章逐个讨论一下这几个选项对网站性能的影响,并给出一些技术分析。 在这一篇文章里,我讨论Page State Persistence这个设置。
什么是Page Sate Persistence
我想大家对ViewState一定不陌生,ViewState是ASP.NET相对ASP新增的一个强大的功能,能够保存一个页面的state。简单的说,就是保存你提交页面时,文本框,下拉列表等等在页面提交那一时刻的值,这样万一你填写的内容通不过检验,就可以用这些信息来还原之前的状态(当然,用处不止这些)。知道ViewSate的人,一般都知道ViewSate使用一个hidden input来保存页面的state信息。网上有很多这样的文章,大家可以Google一下。那这个ViewSate跟性能又有什么关系呢?因为这个hidden input是要跟随PostBack信息在客户端和服务器之间来回传递的,如果这个值太大,自然会影响性能。当然,除了大小,还有一个方面就是ViewState存储的位置了,如果我们不来回传递ViewState的值,而是存储在服务器这一端,自然会减少ViewState在网络上传输占用的时间,但同时却加重了服务器的负担。
可能很多人不知道ASP.NET 2.0的一个新特性就是可以通过重载PageStatePersister类从而实现自定义page ViewState的存储位置。在ASP.NET v1.x里,ViewState只能是存储在之前提到的那个隐藏input元素中。在ASP.NET 2.0 中,新增的SessionPageStatePersister类就提供了把ViewState存储在session里的功能。
开源项目DNN构架如何利用这一新特性
这个开源项目重写了页面的基类,在它自己的基类中,有一个PageStatePersister只读属性,这个属性会根据用户的设置,返回一个System.Web.UI.PageStatePersister实体,之后运行的页面就会用这个实体去实现ViewState的存储,从而实现由用户选择在哪里存储ViewState,从而调节性能。
代码如下:
Get
'Set ViewState Persister to default (as defined in Base Class)
Dim _persister As PageStatePersister = MyBase.PageStatePersister
If Not DotNetNuke.Common.Globals.HostSettings("PageStatePersister") Is Nothing Then
Select Case DirectCast(DotNetNuke.Common.Globals.HostSettings("PageStatePersister"), String)
Case "M"
_persister = New CachePageStatePersister(Me)
Case "D"
_persister = New DiskPageStatePersister(Me)
Case "S"
_persister = New SessionPageStatePersister(Me)
End Select
End If
Return _persister
End Get
End Property
从代码我们可以看到,如果用户选择“Page”,那就使用默认的hidden input元素在页面上存储viewstate(在代码的处理上,是判断其它非选择“Page”项的情况,所以你找不到 Case "P" 这一句);如果用户选用的是"Memory",那么在Case "M"这一句,就会返回一个CachePageStatePersister,这是这个开源系统自定义的一个viewstate处理类。那么DNN开源系统就会使用Cache在服务器端存储viewstate的信息,也就是存储在服务器的“Memory”中。
如果是"D",那么是存储在服务端的文件里,所以是"Disk",但系统似乎保留了这个设置,没有提供界面。
如果是"S",那么是存储在Session里面。这个实现是ASP.NET 2.0 已经提供了的。
