一般情況下,WEB頁面都會(huì)在Internet臨時(shí)文件夾中有一個(gè)臨時(shí)文件.
我在操作IE時(shí)會(huì)出現(xiàn)這種情況:
假如說有一個(gè)頁面Page1.aspx,在我第一次訪問后,它會(huì)在我的Internet臨時(shí)文件夾里有一個(gè)Page1.aspx文件生成.之后,如果我改了Page1.aspx的數(shù)據(jù)后再次訪問該頁面,發(fā)現(xiàn)IE并沒有對(duì)這個(gè)Page1.aspx的數(shù)據(jù)進(jìn)行更新,反而打開的是我第一次訪問的頁面.為什么會(huì)這樣,是因?yàn)镮E自動(dòng)(默認(rèn))調(diào)用了Internet臨時(shí)文件夾里有一個(gè)Page1.aspx文件,而不是重新下載新的Page1.aspx.
怎樣能讓IE自動(dòng)重新下載新的Page1.aspx呢?
一種方法是對(duì)Internet選項(xiàng)進(jìn)行設(shè)置.
Internet選項(xiàng)-->常規(guī)-->Internet臨時(shí)文件中"設(shè)置"-->每次訪問此頁時(shí)檢查.
這種設(shè)置時(shí)最好同時(shí)刪除臨時(shí)文件.
這種方法是讓客戶自己設(shè)置自己的瀏覽器,如果客戶忘記了設(shè)置,那么,新的頁面總是下載不到本地.這時(shí),客戶會(huì)怎樣認(rèn)為呢?("肯定是程序的錯(cuò)!"其實(shí)也不是程序的錯(cuò),但是用程序完全可以解決這個(gè)問題)
第二種方法:用程序自己來讓頁面自動(dòng)下載.
這種方法實(shí)際上是讓頁面不保存到Internet臨時(shí)文件夾中,每次訪問頁面都會(huì)讓瀏覽器下載頁面.
只要在aspx.cs代碼的Page_Load事件中加上
Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
即可.
不防你試試.在不加這句時(shí),你打開頁面,Internet臨時(shí)文件夾里會(huì)有一個(gè)頁面文件,而加了,就會(huì)沒有了.
不過,像aspx文件中如果有圖片文件或js文件,那還是會(huì)下載到Internet臨時(shí)文件夾的.
-------------------------------------------------------------------------------------------------------------------
頁面緩存
使用
OutputCache
指令。
<%@ OutputCache Duration="3600"
?????????????
?
Location="Any"
?????????????
?
VaryByCustom="browser"
?????????????
?
VaryByParam="RequestID" %>
其中
Duration
和
VaryByParam
特性是必須的。
Location
控制頁面緩存的位置
Location
|
含義
|
Any
|
默認(rèn)值。意味著頁面的輸出可以緩存在客戶端瀏覽器,緩存在任何“下游”的客戶端(如代理服務(wù)器),或緩存在
Web
服務(wù)器本身
|
Client
|
指明輸出緩存只能存儲(chǔ)在發(fā)出請(qǐng)求的客戶端(即瀏覽器)的本地緩存中
|
Downstream
|
指明輸出緩存能存儲(chǔ)在任何支持
HTTP1.1
緩存的設(shè)備(如代理服務(wù)器)中
|
Server
|
指明輸出緩存將存儲(chǔ)在
Web
服務(wù)器上
|
None
|
指明該頁面禁用輸出緩存
|
Duration
允許我們控制頁面在緩存中生存的時(shí)間(單位是秒)
VaryByParam
允許我們緩存頁面的不同版本。在上面的例子中,
VaryByParam
設(shè)為了
RequestID
,所以
ASP.NET
使用
RequestID
參數(shù)的不同值,這些值或者是在
HTTP GET
的查詢字符串中傳入,或者是在
HTTP POST
的參數(shù)中傳入。可以通過檢查
RequestID
參數(shù)的值讓應(yīng)用程序區(qū)分不同的用戶;通過在頁面的
OutputCache
指令中放置
VaryByParam
=
"RequestID"
,可以讓
ASP.NET
為每個(gè)用戶緩存頁面的不同版本。
如果不想根據(jù)參數(shù)的值緩存頁面的不問版本,那么只要把
VaryByParam
設(shè)為
none
。
也可以要求
ASP.NET
為每個(gè)可能的參數(shù)組合緩存頁面的一個(gè)版本。為此,可把
VaryByParam
設(shè)為
*
。
VaryByHeader
和
VaryByCustom
特性與
VaryByParam
的相似之處在于,它們?cè)试S指定何時(shí)應(yīng)創(chuàng)建頁面新的緩存版本。
VaryByHeader
允許我們根據(jù)由分號(hào)分隔的
HTTP
頭的列表末緩存頁面的不向版本。
VaryByCustom
當(dāng)設(shè)為
browser
時(shí),允許我們根據(jù)瀏覽器的名稱和主版本信息緩存不同版本。也可以把它設(shè)為一個(gè)自定義方法的名稱,從而實(shí)現(xiàn)我們自己的邏輯,控制緩存的版本。
片斷緩存
可以利用用戶控件將頁面分段,在
ascx
文件中寫入緩存的語句,而不在
aspx
文件中寫緩存語句,這樣
ASP.NET
就可以只緩存
ascx
片斷的輸出了。一般像頁眉或頁腳基本上都是一樣的,就不需要重新加載。但是如果其中有動(dòng)態(tài)變化的數(shù)據(jù)就不能對(duì)其進(jìn)行緩存,因?yàn)橐坏┍痪彺婧蟪绦蚓筒粫?huì)再創(chuàng)建它的實(shí)例來更新數(shù)據(jù)顯示,只有等到生存期過期才行,所以對(duì)于這種情況就不適于用頁面片斷緩存。
注意:
一、注意片段緩存不支持
Location
特性;緩存頁面片段惟一合法的地方是
web
服務(wù)器。這是因?yàn)槠尉彺嬖?
ASP.NET
中是新的功能,所以瀏覽器和代理服務(wù)器不支持。
二、片段緩存有另外一個(gè)在頁面緩存中沒有的特性——
VaryByControl
。
VaryByControl
特性允許指定一個(gè)由分號(hào)分隔的字符串列表,代表用戶控件內(nèi)使用的控件的名稱;
ASP.NET
將針對(duì)值的每個(gè)不同的組合生成用戶構(gòu)件的一個(gè)緩存版本。
數(shù)據(jù)緩存
低級(jí)
API
是
Cache
類,它位于
ASP.NET
中的
System.web.Caching
命名空間,可以用它緩存生成很耗費(fèi)資源的數(shù)據(jù)。
Cache
類的使用和
Session
與
Application
對(duì)象一樣簡(jiǎn)單。每個(gè)應(yīng)用程序只有一個(gè)
Cache
對(duì)象——這意味著使用
Cache
對(duì)象存儲(chǔ)在緩存中的數(shù)據(jù)是應(yīng)用程序級(jí)別的數(shù)據(jù)。使事情更為簡(jiǎn)單的是,
Page
類的
Cache
屬性使應(yīng)用程序的
Cache
對(duì)象實(shí)例能在代碼中使用。
通過
Cache
對(duì)象緩存的數(shù)據(jù)存儲(chǔ)在應(yīng)用程序的內(nèi)存中。這意味著該數(shù)據(jù)的生存期不會(huì)超過應(yīng)用程序的重啟
(
事實(shí)上,這和存儲(chǔ)在
Application
與
Session
對(duì)象中的數(shù)據(jù)一樣,除非使用
StateService
或
SQL State
會(huì)話模式存儲(chǔ)
Session
數(shù)據(jù)
)
。
具體的使用和語法與
Session
和
Application
一樣。轉(zhuǎn)換回來的時(shí)候需要注意對(duì)其進(jìn)行相應(yīng)類型的強(qiáng)制類型轉(zhuǎn)換。
這不是在
ASP.NET
緩存中添加緩存項(xiàng)的惟一方式。
Cache
對(duì)象有兩個(gè)方法
Insert()
方法和
Add()
方法,它們靈活性更高。它們的用法近似,但稍有不同:
Insert()
方法用于覆蓋
ASP.NET
緩存中現(xiàn)有的緩存項(xiàng)。
Add()
方法只用于在
ASP.NET
緩存中添加新的緩存項(xiàng)
(
如果用它覆蓋現(xiàn)有的緩存項(xiàng),則會(huì)失敗
)
。
每個(gè)方法都有
7
個(gè)參數(shù),而且兩個(gè)方法的參數(shù)相同。
在緩存某一項(xiàng)時(shí),可以指定它的相關(guān)性,告訴
ASP.NET
該緩存項(xiàng)在緩存中一直保留到某個(gè)事件發(fā)生時(shí)為止。
相關(guān)性值
|
含義
|
CacheDependency
|
允許指定一個(gè)文件或緩存鍵。如果文件發(fā)生變化,對(duì)象就被刪除。如果緩存鍵發(fā)生變化,對(duì)象也被刪除。
|
DateTime
|
這是一個(gè)
DataTime
值,指明緩存數(shù)據(jù)過期的時(shí)間(絕對(duì)過期時(shí)間)
|
TimeSpan
|
這是一個(gè)時(shí)間間隔,指明緩存數(shù)據(jù)在上一次訪問后可以在緩存中保留多長(zhǎng)時(shí)間(彈性過期時(shí)間)
|
使用
CacheItemPriority
來指定緩存數(shù)據(jù)的優(yōu)先級(jí),以便在緩存被填滿的時(shí)候刪除那些優(yōu)先級(jí)低的數(shù)據(jù)。
優(yōu)先級(jí)值
|
含義
|
High
|
設(shè)為此優(yōu)先級(jí)的緩存項(xiàng)是最不可能在內(nèi)存不足時(shí)被刪除的
|
AboveNormal
|
設(shè)為此優(yōu)先級(jí)的緩存項(xiàng)比優(yōu)先級(jí)為
Normal
或以下的緩存項(xiàng)更優(yōu)先保留
|
|
設(shè)為此優(yōu)先級(jí)的緩存項(xiàng)比優(yōu)先級(jí)為
BelowNormal
和
Low
的緩存項(xiàng)更優(yōu)先保留
|
BelowNormal
|
這是倒數(shù)第二級(jí)的優(yōu)先級(jí);設(shè)為此優(yōu)先級(jí)的緩存項(xiàng)只比優(yōu)先級(jí)設(shè)為
Low
的緩存項(xiàng)更優(yōu)先保留
|
Low
|
設(shè)為此優(yōu)先級(jí)的緩存項(xiàng)是最有可能在內(nèi)存不足時(shí)被刪除的
|
Default
|
緩存項(xiàng)的優(yōu)先級(jí)的默認(rèn)值是
Normal
|
NotRemovable
|
當(dāng)緩存項(xiàng)設(shè)為此優(yōu)先級(jí)時(shí),是在告訴
ASP.NET
即使是內(nèi)存不足,也不要從緩存中刪除它
|
DateTime dt
=
new
DateTime(DateTime
.
Now
.
Year,
12
,
31
);
Cache
.
Add(
"MembersDataSet"
,dsMembers,
null
,
dt,TimeSpan
.
Zero,
CacheItemPriority
.
Normal,
null
);
第一個(gè)參數(shù)是引用緩存對(duì)象的鍵,第二個(gè)參數(shù)是要緩存的對(duì)象。第三個(gè)參數(shù)是
null(
表明沒有相關(guān)性
)
。
第四和第五個(gè)參數(shù)是絕對(duì)的過期時(shí)間和彈性的過期時(shí)間。這里,我們指定緩存應(yīng)在當(dāng)前年份的最后一天過期
(dt)
。我們想指定沒有彈性的過期時(shí)間,所以第五個(gè)參數(shù)使用
TimeSpan.Zero
。第六個(gè)參數(shù)使用
System.Web.Caching.CacheItemPriority
枚舉中的一個(gè)值,把優(yōu)先級(jí)設(shè)為
Normal
。
指定一個(gè)
5
分鐘的彈性過期時(shí)間,沒有指定絕對(duì)過期時(shí)間
Cache
.
Add(
"MembersDataSet"
,dsMembers,
null
,
???????????????
DateTime
.
MaxValue,TimeSpan
.
FromMinutes(
5
),
???????????
CacheItemPriority
.
Normal,
null
);
添加一個(gè)相關(guān)性。在這個(gè)例子中,過期時(shí)間也取決于一個(gè)文件的修改,即
test.xml
文件:
CacheDependency dep
=
new
CacheDependency(
@"C:\test.xml"
);
Cache
.
Add(
"MembersDataSet"
,dsMembers,dep,
???????????????
DateTime
.
MaxValue,TimeSpan
.
FromMinutes(
5
),
???????????
CacheItemPriority
.
Normal,
null
);
過期時(shí)間取決于緩存中另一項(xiàng)的修改:
String[] dependencyKeys
=
new
String[
1
];
dependencyKeys[
0
]
=
"MembersChanged"
;
CacheDependency dependency
=
new
CacheDependency(
null
, dependencyKeys);
Cache
.
Add(
"MembersDataSet"
,dsMembers,dependency,
???????????????
DateTime
.
MaxValue,TimeSpan
.
Zero,
???????????
CacheItemPriority
.
Normal,
null
);
最后一個(gè)參數(shù)是
CacheItemRemovedCallback
類型的,允許我們?cè)诰彺骓?xiàng)從緩存中刪除時(shí)要求通知,可以編寫一個(gè)自定義的方法
(
像這里的
ItemRemovedCallback()
方法
)
,然后在第
7
個(gè)參數(shù)中指定該方法:
???????
public
void
ItemRemovedCallback(String key, Object
value
, CacheItemRemovedReason reason)
???????
{
???????
}
Cache
.
Add(
"MembersDataSet"
,dsMembers,dependency,
???????
???????
DateTime
.
MaxValue,TimeSpan
.
FromMinutes(
5
),
???
???????
CacheItemPriority
.
Normal,
new
CacheItemRemovedCallback(
this
.
ItemRemovedCallback));
第一個(gè)參數(shù)是在緩存中存儲(chǔ)緩存項(xiàng)時(shí)使用的鍵,第二個(gè)是存儲(chǔ)的對(duì)象本身,第三個(gè)是緩存項(xiàng)刪除的原因。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
