ASP.NET筆記之 viewstate與cache的使用

來源:互聯網
上載者:User

1、

(1、預設情況下ASP.Net是啟用ViewState的,這樣在頁面中會產生冗長的隱藏欄位,ViewState對於需要PostBack處理的頁面才可能有用,對於新聞展示頁面不需要互動完全沒必要用ViewState。

(2、禁用ViewState的方式:
• 頁面整體禁用ViewState:在頂部Page中EnableViewState="False"
• 指定控制項禁用ViewState,在控制項上EnableViewState="False"

(3、頁面禁用ViewState以後並沒有完全去掉ViewState,只要ViewState不是很大就可以了。如果要求一點兒ViewState都不能有,那麼則頁面中不能有runat=server的form,如果頁面中沒有表單元素,把form完全去掉就可以。如果Button等服務端控制項沒有放到runat=server的form中,那麼則是停用。

2、cache

(1、如果每次進入頁面的時候都查詢資料庫產生頁面內容的話,如果訪問量非常大,則網站效能會非常差。而如果只有第一次訪問的時候才查詢資料庫產生頁面內容,以後都直接輸出內容,則能提高系統效能。這樣無論有多少人訪問都只訪問一次資料庫,資料庫壓力不變。

緩衝是一種用空間換取時間的技術,存在於電腦中很多地方,用來將一些慢速裝置中的常用資料儲存在快速裝置中,取資料的時候直接從快速裝置中取。比如CPU二級緩衝、windows檔案讀取緩衝。

緩衝存在失效的問題:為了保證從緩衝中讀取資料和慢速資料中資料一致,則需要在慢速資料中對應的資料發生變化的時候,清除緩衝中相應的資料。
緩衝是改進網站效能的第一個手段,就像索引是改進資料庫效能的第一個手段一樣。
ASP.net緩衝主要分為:頁面緩衝、資料來源緩衝、資料緩衝這三種主要類型。

(2、頁面緩衝

給頁面添加下面的標籤就可以啟用頁面緩衝,

複製代碼 代碼如下:<%@ OutputCache Duration="20" VaryByParam="none"%>

這樣整個頁面的內容都會被緩衝,頁面中的ASP.Net代碼、資料來源在緩衝期間都不會被運行,而是直接輸出緩衝的頁面內容。 Duration表示緩衝時間,以秒為單位,超過這個時間則緩衝失效,再次產生以後會再緩衝20秒,以此類推。在Page_Load處設定斷點、修改資料庫資料測試。
緩衝是針對所有這個頁面的訪問者。這樣1個訪問者和1萬個訪問者、一次訪問和100萬次訪問對資料庫的壓力是一樣的。

***對於看新聞頁面來講,如果如上設定的話,則會緩衝在第一個看到的新聞,因為?id=2、?id=3隻是頁面的不同參數而已,為了能讓不同的新聞各自緩衝,因此可以設定VaryByParam="id"表示對於不同的id參數進行單獨緩衝如果有多個確定緩衝的參數,則將參數名用分號隔開即可,比如VaryByParam="id;number"。
如果想讓任何不同的查詢字串都建立不同的緩衝,則設定VaryByParam="*",一般情況下設定“*”就足夠。
在WebUserControl中也可以像頁面緩衝一樣設定控制項的緩衝。

(3、 資料來源緩衝
設定ObjectDataSource的CacheDuration(緩衝時間:秒),EnableCaching=true。這樣每隔CacheDuration指定的時間段才調用SelectMethod指定的方法來執行資料庫查詢,其他時候都是直接返回緩衝的資料。

緩衝固定的時間適用於首頁、文章列表等訪問頻繁的頁面,對於看貼頁面則不適合,假設有100萬個文章,如果每個文章都是固定緩衝1小時的話,假設一小時之內有10萬個文章被看了,那麼就要緩衝十萬個文章,非常佔用記憶體,因為“百年一看”的“墳帖”偶然被訪問一次也緩衝一個小時,佔用記憶體。這時候可以採用“滑動視窗(sliding)”策略,比如文章緩衝10分鐘,如果10分鐘之內又訪問了,則緩衝的失效時間修改為從被訪問這一刻起的10分鐘之後,以此類推。這樣經常訪問的文章就可以“長期緩衝”,而不經常訪問的文章也不會因為偶然訪問而長期佔用緩衝。設定方法,資料來源:CacheExpirationPolicy="Sliding"。面試可聊。todo:貌似滑動有問題。不是問題,Sliding只是策略,伺服器會參考。

(4、 緩衝其他
頁面緩衝、資料來源緩衝等內部都是使用HttpRuntime.Cache來實現緩衝的,在一些頁面緩衝、資料來源緩衝完成不了的特殊的緩衝要求中,可以直接調用HttpRuntime.Cache進行緩衝。

(*)ASP.Net緩衝預設是儲存在記憶體中的,還可以配置儲存到資料庫中。大型網站還會配合使用Memcached等技術。
清除緩衝。在緩衝還未失效的時候可能需要立即清空緩衝,讓資料庫的修改立即反映到介面中。ASP.Net沒有提供現成的方法,可以使用Hack層級的代碼。

3、錯誤頁面

(1、當頁面發生錯誤的時候,ASP.Net會將錯誤資訊展示出來,這樣一來不好看,二來會泄露網站的內部實現資訊,給網站帶來安全隱患,因此需要定製錯誤頁,發生錯誤時顯示開發人員定製的頁面。404頁面放點廣告也是好的嘛。
配置web.config,配置system.web內的customErrors地區:

複製代碼 代碼如下:<customErrors mode="On" defaultRedirect="~MyErrorPage.aspx">
<error statusCode="403" redirect="~/NoAccess.htm" />
<error statusCode="404" redirect="~/FileNotFound.htm" />
</customErrors>

**mode三個可選值:On:總是顯示定製錯誤頁面;Off:不顯示定製錯誤介面,直接顯示呼叫堆疊等異常資訊;

**remoteonly:對於原生訪問顯示呼叫堆疊等異常資訊,對於外部使用者的顯示定製錯誤頁面

一般設定為RemoteOnly,這樣發生錯誤的話,管理員可以在伺服器的瀏覽器中看詳細錯誤資訊,普通使用者看不到。

學習示範的時候mode設定為On,否則看不到定製頁。可以在定義錯誤頁中判斷Request.UserHostAddress來設定某些ip看到異常資訊,可以讀取Session如果是管理員則可以看異常資訊。

(2、error子項目設定對於不同狀態代碼使用不同的錯誤頁,很多網站把404做一個特殊的錯誤頁。沒有單獨設定的狀態代碼錯誤則顯示defaultRedirect中指定的頁面。
錯誤頁即可以使用htm頁面,也可以使用aspx頁面。在aspx頁面中可以用HttpContext.Current.Server.GetLastError()拿到異常對象。一般不要把異常資訊顯示給使用者,而是使用後面講的Log4Net等將異常記錄到系統日誌。

*****如果要在錯誤頁面中拿到異常對象,比如customErrors中設定redirectMode="ResponseRewrite",因為預設是用戶端重新導向(redirectMode="ResponseRedirect"),在錯誤頁面中就拿不到異常對象了。*****

複製代碼 代碼如下:<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~MyErrorPage.aspx">
<error statusCode="403" redirect="~/NoAccess.htm" />
<error statusCode="404" redirect="~/FileNotFound.htm" />
</customErrors>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.