好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

化恶魔为天使,巧移ViewState至SqlServer

(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用ViewState的情况) ViewState 一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传( PostBack )数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。 最近

(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用ViewState的情况)
ViewState 一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传( PostBack )数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。

最近项目中用到了 Telerik 的 RadGrid, 使用服务器端绑定数据后页面 ViewState 体积过大,而导致性能严重降低,便开始找寻优化方式,尽量将 ViewState 存在 服 务器端 。

由于项目已开发至中期,不可能做类似于取消 ViewState 或使用客户端绑定之类的大规模改动。

要想改动量最小化,肯定不能影响原有 ViewState 的使用,那只能重写 Page 类的 LoadPageStateFromPersistenceMedium() 和 SavePageStateToPersistenceMedium(object state) 的方法,在这两个 Override 的方法中把数据存在别的什么地方。

这时候就来问题了,ViewState 只是一个页面的周期,每打开一个页面都会生成一个新的 ViewState ,连刷新都不例外,如果存在文件或数据库中,这些数据累积起来可不是开玩笑的,而且也用不上了,那还不得要写过期删除的方法么?太麻烦了。 这时候, Session 就发挥大作用了, Session 的生命周期长于 ViewState ,过期会自动删除,而且还是存在服务器端的,不会增加数据传输量,看来很合适。

代码如下:

Code
public class AmoPage: System.Web.UI.Page
{
#region === Move View State To Session ===

private string _pageGuid = null ;
public string PageGUID
{
get
{
if (_pageGuid == null )
_pageGuid = this .Request.Form[ " __AmoViewState " ];
if (_pageGuid == null )
_pageGuid = Guid.NewGuid().ToString();
return _pageGuid;
}
set { _pageGuid = value; }
}

protected override object LoadPageStateFromPersistenceMedium()
{
return Session[ this .PageGUID];
}

protected override void SavePageStateToPersistenceMedium( object state)
{
RegisterHiddenField( " __AmoViewState " , this .PageGUID);
Session[ this .PageGUID] = state;
}

#endregion
}


但是不能忽略一个问题, Session 默认是由 WebServer 管理的,一般只用于存储会话中用户登录信息这种数据量极小的情况,如果直接把 ViewState 这个大胖子塞进去,全部是保存在内存中的,无疑用不了多长时间, WebServer 就会因为 Session 数据量过大而崩溃。看来我们还需要转移 Session 。

正好 ,ASP.NET 支持自定义会话管理的方式:

开始 -> All Programs-> Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 Command Prompt

进入 VS 命令行模式。

执行 aspnet_regsql –S (192.168.19.250) –U sa –P 123 –ssadd

这是指使用用户名 sa 密码 123 登录到 SQLServer 服务器 192.168.19.250 上添加状态管理相关的数据库。其实它是建立了一个只有出口存储过程的数据库 ASPState ,并在系统数据库 tempdb 中加入了两张分别用于存储 Application 和 Session 的表。

这时候我们就完成了状态管理相关的数据库的创建,然后只要在 Web.config 中做如下设置即可

system.web >
sessionState mode ="SQLServer" sqlConnectionString ="Data Source=192.168.19.250;User ID=sa;Password=123;" > sessionState >
system.web >


这时候,该 Web 应用的 Session 数据就会存储于数据库中。

在使用的时候,只要将原有的页面都从AmoPage类继承就行。

至于效果,试过就知道!
使用前:(很熟悉吧...)


使用后:(干净,清透,没问题!)

查看更多关于化恶魔为天使,巧移ViewState至SqlServer的详细内容...

  阅读:47次