您好,登錄后才能下訂單哦!
ASP.NET中viewstate與cache如何使用,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
(1、默認(rèn)情況下ASP.Net是啟用ViewState的,這樣在頁(yè)面中會(huì)生成冗長(zhǎng)的隱藏字段,ViewState對(duì)于需要PostBack處理的頁(yè)面才可能有用,對(duì)于新聞?wù)故卷?yè)面不需要交互完全沒(méi)必要用ViewState。
(2、禁用ViewState的方式:
? 頁(yè)面整體禁用ViewState:在頂部Page中EnableViewState="False"
? 指定控件禁用ViewState,在控件上EnableViewState="False"
(3、頁(yè)面禁用ViewState以后并沒(méi)有完全去掉ViewState,只要ViewState不是很大就可以了。如果要求一點(diǎn)兒ViewState都不能有,那么則頁(yè)面中不能有runat=server的form,如果頁(yè)面中沒(méi)有表單元素,把form完全去掉就可以。如果Button等服務(wù)端控件沒(méi)有放到runat=server的form中,那么則是不可用的。
2、cache
(1、如果每次進(jìn)入頁(yè)面的時(shí)候都查詢數(shù)據(jù)庫(kù)生成頁(yè)面內(nèi)容的話,如果訪問(wèn)量非常大,則網(wǎng)站性能會(huì)非常差。而如果只有第一次訪問(wèn)的時(shí)候才查詢數(shù)據(jù)庫(kù)生成頁(yè)面內(nèi)容,以后都直接輸出內(nèi)容,則能提高系統(tǒng)性能。這樣無(wú)論有多少人訪問(wèn)都只訪問(wèn)一次數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)壓力不變。
緩存是一種用空間換取時(shí)間的技術(shù),存在于計(jì)算機(jī)中很多地方,用來(lái)將一些慢速設(shè)備中的常用數(shù)據(jù)保存在快速設(shè)備中,取數(shù)據(jù)的時(shí)候直接從快速設(shè)備中取。比如CPU二級(jí)緩存、windows文件讀取緩存。
緩存存在失效的問(wèn)題:為了保證從緩存中讀取數(shù)據(jù)和慢速數(shù)據(jù)中數(shù)據(jù)一致,則需要在慢速數(shù)據(jù)中對(duì)應(yīng)的數(shù)據(jù)發(fā)生變化的時(shí)候,清除緩存中相應(yīng)的數(shù)據(jù)。
緩存是改進(jìn)網(wǎng)站性能的第一個(gè)手段,就像索引是改進(jìn)數(shù)據(jù)庫(kù)性能的第一個(gè)手段一樣。
ASP.net緩存主要分為:頁(yè)面緩存、數(shù)據(jù)源緩存、數(shù)據(jù)緩存這三種主要類型。
(2、頁(yè)面緩存
給頁(yè)面添加下面的標(biāo)簽就可以啟用頁(yè)面緩存,
復(fù)制代碼 代碼如下:
<%@ OutputCache Duration="20" VaryByParam="none"%>
這樣整個(gè)頁(yè)面的內(nèi)容都會(huì)被緩存,頁(yè)面中的ASP.Net代碼、數(shù)據(jù)源在緩存期間都不會(huì)被運(yùn)行,而是直接輸出緩存的頁(yè)面內(nèi)容。 Duration表示緩存時(shí)間,以秒為單位,超過(guò)這個(gè)時(shí)間則緩存失效,再次生成以后會(huì)再緩存20秒,以此類推。在Page_Load處設(shè)置斷點(diǎn)、修改數(shù)據(jù)庫(kù)數(shù)據(jù)測(cè)試。
緩存是針對(duì)所有這個(gè)頁(yè)面的訪問(wèn)者。這樣1個(gè)訪問(wèn)者和1萬(wàn)個(gè)訪問(wèn)者、一次訪問(wèn)和100萬(wàn)次訪問(wèn)對(duì)數(shù)據(jù)庫(kù)的壓力是一樣的。
***對(duì)于看新聞頁(yè)面來(lái)講,如果如上設(shè)置的話,則會(huì)緩存在第一個(gè)看到的新聞,因?yàn)?id=2、?id=3只是頁(yè)面的不同參數(shù)而已,為了能讓不同的新聞各自緩存,因此可以設(shè)置VaryByParam="id",表示對(duì)于不同的id參數(shù)進(jìn)行單獨(dú)緩存。如果有多個(gè)確定緩存的參數(shù),則將參數(shù)名用分號(hào)隔開(kāi)即可,比如VaryByParam="id;number"。
如果想讓任何不同的查詢字符串都創(chuàng)建不同的緩存,則設(shè)置VaryByParam="*",一般情況下設(shè)置“*”就足夠。
在WebUserControl中也可以像頁(yè)面緩存一樣設(shè)置控件的緩存。
(3、 數(shù)據(jù)源緩存
設(shè)定ObjectDataSource的CacheDuration(緩存時(shí)間:秒),EnableCaching=true。這樣每隔CacheDuration指定的時(shí)間段才調(diào)用SelectMethod指定的方法來(lái)執(zhí)行數(shù)據(jù)庫(kù)查詢,其他時(shí)候都是直接返回緩存的數(shù)據(jù)。
緩存固定的時(shí)間適用于首頁(yè)、文章列表等訪問(wèn)頻繁的頁(yè)面,對(duì)于看貼頁(yè)面則不適合,假設(shè)有100萬(wàn)個(gè)帖子,如果每個(gè)帖子都是固定緩存1小時(shí)的話,假設(shè)一小時(shí)之內(nèi)有10萬(wàn)個(gè)帖子被看了,那么就要緩存十萬(wàn)個(gè)帖子,非常占用內(nèi)存,因?yàn)椤鞍倌暌豢础钡摹皦炋迸既槐辉L問(wèn)一次也緩存一個(gè)小時(shí),占用內(nèi)存。這時(shí)候可以采用“滑動(dòng)窗口(sliding)”策略,比如帖子緩存10分鐘,如果10分鐘之內(nèi)又訪問(wèn)了,則緩存的失效時(shí)間修改為從被訪問(wèn)這一刻起的10分鐘之后,以此類推。這樣經(jīng)常訪問(wèn)的帖子就可以“長(zhǎng)期緩存”,而不經(jīng)常訪問(wèn)的帖子也不會(huì)因?yàn)榕既辉L問(wèn)而長(zhǎng)期占用緩存。設(shè)置方法,數(shù)據(jù)源:CacheExpirationPolicy="Sliding"。面試可聊。todo:貌似滑動(dòng)有問(wèn)題。不是問(wèn)題,Sliding只是策略,服務(wù)器會(huì)參考。
(4、 緩存其他
頁(yè)面緩存、數(shù)據(jù)源緩存等內(nèi)部都是使用HttpRuntime.Cache來(lái)實(shí)現(xiàn)緩存的,在一些頁(yè)面緩存、數(shù)據(jù)源緩存完成不了的特殊的緩存要求中,可以直接調(diào)用HttpRuntime.Cache進(jìn)行緩存。
(*)ASP.Net緩存默認(rèn)是保存在內(nèi)存中的,還可以配置保存到數(shù)據(jù)庫(kù)中。大型網(wǎng)站還會(huì)配合使用Memcached等技術(shù)。
清除緩存。在緩存還未失效的時(shí)候可能需要立即清空緩存,讓數(shù)據(jù)庫(kù)的修改立即反映到界面中。ASP.Net沒(méi)有提供現(xiàn)成的方法,可以使用Hack級(jí)別的代碼。
3、錯(cuò)誤頁(yè)面
(1、當(dāng)頁(yè)面發(fā)生錯(cuò)誤的時(shí)候,ASP.Net會(huì)將錯(cuò)誤信息展示出來(lái),這樣一來(lái)不好看,二來(lái)會(huì)泄露網(wǎng)站的內(nèi)部實(shí)現(xiàn)信息,給網(wǎng)站帶來(lái)安全隱患,因此需要定制錯(cuò)誤頁(yè),發(fā)生錯(cuò)誤時(shí)顯示開(kāi)發(fā)人員定制的頁(yè)面。404頁(yè)面放點(diǎn)廣告也是好的嘛。
配置web.config,配置system.web內(nèi)的customErrors區(qū)域:
復(fù)制代碼 代碼如下:
<customErrors mode="On" defaultRedirect="~MyErrorPage.aspx">
<error statusCode="403" redirect="~/NoAccess.htm" />
<error statusCode="404" redirect="~/FileNotFound.htm" />
</customErrors>
**mode三個(gè)可選值:On:總是顯示定制錯(cuò)誤頁(yè)面;Off:不顯示定制錯(cuò)誤界面,直接顯示調(diào)用堆棧等異常信息;
**remoteonly:對(duì)于本機(jī)的訪問(wèn)顯示調(diào)用堆棧等異常信息,對(duì)于外部用戶的顯示定制錯(cuò)誤頁(yè)面。
一般設(shè)置為RemoteOnly,這樣發(fā)生錯(cuò)誤的話,管理員可以在服務(wù)器的瀏覽器中看詳細(xì)錯(cuò)誤信息,普通用戶看不到。
學(xué)習(xí)演示的時(shí)候mode設(shè)置為On,否則看不到定制頁(yè)??梢栽诙x錯(cuò)誤頁(yè)中判斷Request.UserHostAddress來(lái)設(shè)置某些ip看到異常信息,可以讀取Session如果是管理員則可以看異常信息。
(2、error子元素設(shè)定對(duì)于不同狀態(tài)碼使用不同的錯(cuò)誤頁(yè),很多網(wǎng)站把404做一個(gè)特殊的錯(cuò)誤頁(yè)。沒(méi)有單獨(dú)設(shè)置的狀態(tài)碼錯(cuò)誤則顯示defaultRedirect中指定的頁(yè)面。
錯(cuò)誤頁(yè)即可以使用htm頁(yè)面,也可以使用aspx頁(yè)面。在aspx頁(yè)面中可以用HttpContext.Current.Server.GetLastError()拿到異常對(duì)象。一般不要把異常信息顯示給用戶,而是使用后面講的Log4Net等將異常記錄到系統(tǒng)日志。
*****如果要在錯(cuò)誤頁(yè)面中拿到異常對(duì)象,比如customErrors中設(shè)置redirectMode="ResponseRewrite",因?yàn)槟J(rèn)是客戶端重定向(redirectMode="ResponseRedirect"),在錯(cuò)誤頁(yè)面中就拿不到異常對(duì)象了。*****
復(fù)制代碼 代碼如下:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~MyErrorPage.aspx">
<error statusCode="403" redirect="~/NoAccess.htm" />
<error statusCode="404" redirect="~/FileNotFound.htm" />
</customErrors>
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。