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>