Server Side ViewState 在伺服器端存貯ViewState (ASP.NET 2.0)

來源:互聯網
上載者:User
View State 在 Asp.Net 的 postback 機制中有著舉足輕重的地位,但是在頻寬緊張的環境下(比如跨國訪問)龐大的hiddenfield 往往成為系統瓶頸。有什麼辦法可以在伺服器端儲存View State嗎?答案是肯定的。

方法一:
The Code Project 上的一篇文章Keep ASP.NET ViewState out of ASPX Page for Performance Improvement ,採用override Page 的SavePageStateToPersistenceMediumLoadPageStateFromPersistenceMedium 兩個方法,把View State儲存在Session或cache中。
但是這種方法總顯的過於繁瑣,有沒有什麼更簡便的方法呢?

方法二:
ASP.NET 2.0 Quick Start中有這麼一段     Page-state, (the cumulative view-state and control-state for the controls and the page) is typically persisted to the page's response, using the HiddenFieldStatePersister (it is the VIEWSTATE hidden field). You can override the PageStatePersister on the Page for custom persistence however. Given the adaptive nature of controls to the requesting device, some devices may not handle significant amounts of data that are typically 'round-tripped'. Through the PageAdapter configured for a device, the state can be persisted to alternative sources. ASP.NET 2.0 defines two page state persisters, HiddenFieldPageStatePersister and SessionPageStatePersister.

其實ASP.NET 2.0中已經內建了把ViewState存貯在Session中的SessionPageStatePersister,只要override Page的PageStatePersister屬性,把返回HiddenFieldPageStatePersister 改為返回SessionPageStatePersister就可以了。這樣實在是很方便哦。

但是我又發現了一件很不爽的事情,我們來看一下Page.PageStatePersister的代碼: protected virtual PageStatePersister PageStatePersister
{
      get
      {
            if (this._persister == null)
            {
                  PageAdapter adapter1 = this.PageAdapter;
                  if (adapter1 != null)
                  {
                        this._persister = adapter1.GetStatePersister();
                  }
                  if (this._persister == null)
                  {
                        this._persister = new HiddenFieldPageStatePersister(this);
                  }
            }
            return this._persister;
      }
}

我們雖然可以重載PageStatePersister屬性,卻不能修改_persister。在Page的其他很多地方是直接調用_persister的。這樣可能會造成某種程度的不一致。
有什麼辦法呢?注意到上面的那個PageAdapter嗎?我們就拿它開刀。

方法三:
首先寫一個我們自己的PageAdapter

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;

namespace my
{
    public class PageStateAdapter : System.Web.UI.Adapters.PageAdapter
    {
        public override PageStatePersister GetStatePersister()
        {
            return new SessionPageStatePersister(this.Page);
        }
    }
}

然後在網站下添加App_Browsers目錄,並在目錄下添加PageStateAdapter.browser : <browsers>
    <browser refID="Default">
        <controlAdapters>
           <adapter controlType="System.Web.UI.Page" adapterType="my.PageStateAdapter" />
        </controlAdapters>
    </browser>
</browsers>

好了我們的Server Side View State完成了,你可以比較一下前後產生的檔案大小,越是複雜的頁面效果越明顯。當然這是以犧牲伺服器效能為代價的。需要注意的是:所謂的server side,還要依賴於網站的session的存貯方式是如何配置的,不過這不在本文的討論範圍之內。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.