ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 化恶魔为天使,巧移ViewState至SqlServer

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

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-07-23 10:43:28 0 删除 编辑

ViewState一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传(PostBack)数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。

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

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

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

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

代码如下:


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类继承就行。

至于效果,试过就知道!

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-609988/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5766495