當用戶訪問頁面時,整個頁面將會被服務器保存在內存中,這樣就對頁面進行了緩存。當用戶再次訪問該頁,頁面不會再次執行數據操做,頁面首先會檢查服務器中是否存在緩存,若是緩存存在,則直接從緩存中獲取頁面信息,若是頁面不存在,則建立緩存。json
頁面輸出緩存適用於那些數據量較多,而不會進行過多的事件操做的頁面,若是一個頁面須要執行大量的事件更新,以及數據更新,則並不能使用頁面輸出緩存。緩存
一般咱們在緩存aspx頁面的時候,能夠頁面經過以下設置服務器
<%@ OutputCache Duration="120" VaryByParam="paramName" %>app
上述代碼使用@OutputCatch指令聲明瞭頁面緩存,該頁面將被緩存120秒。@OutputCatch指令包括10個屬性,經過這些屬性可以分別爲頁面的不一樣狀況進行緩存設置,經常使用的屬性以下所示:ide
CacheProfile:獲取或設置OutputCacheProfile名稱。性能
Duration:獲取或設置緩存項須要保留在緩存中的時間。ui
VaryByHeader:獲取或設置用於改變緩存項的一組都好分隔的HTTP標頭名稱。spa
Location:獲取或設置一個值,該值肯定緩存項的位置,包括Any、Clint、Downstream、None、Server和ServerAndClient。默認值爲Any。code
VaryByControl:獲取或設置一簇分好分隔的控件標識符,這些標識符包含在當前頁或用戶控件內,用於改變當前的緩存項。blog
NoStore:獲取或設置一個值,該值肯定是否設置了「Http Cache-Control:no-store」指令。
VaryByCustom:獲取輸出緩存用來改變緩存項的自定義字符串列表。
Enabled:獲取或設置一個值,該值指示是否對當前內容啓用了輸出緩存。
VaryByParam:獲取查詢字符串或窗體POST參數的列表。
對於aspx頁面來講,很是簡單。那麼在ashx頁面中,咱們又該如何設頁面緩存呢?
直接上代碼,以下:
public class autocomp : IHttpHandler { public void ProcessRequest(HttpContext context) { OutputCachedPage page = new OutputCachedPage(new OutputCacheParameters { Duration = 120, Location = OutputCacheLocation.Any, VaryByParam = "paramName" }); page.ProcessRequest(HttpContext.Current); context.Response.ContentType = "application/json"; context.Response.BufferOutput = true; var searchTerm = (context.Request.QueryString["paramName"] + "").Trim(); context.Response.Write(searchTerm); context.Response.Write(DateTime.Now.ToString("s")); } public bool IsReusable { get { return false; } } private sealed class OutputCachedPage : Page { private OutputCacheParameters _cacheSettings; public OutputCachedPage(OutputCacheParameters cacheSettings) { // Tracing requires Page IDs to be unique. ID = Guid.NewGuid().ToString(); _cacheSettings = cacheSettings; } protected override void FrameworkInitialize() { base.FrameworkInitialize(); InitOutputCache(_cacheSettings); } } }
若是Query String多個查詢參數,注意查看VaryByParam
public class test : IHttpHandler { public void ProcessRequest(HttpContext context) { OutputCachedPage page = new OutputCachedPage(new OutputCacheParameters { Duration = 120, Location = OutputCacheLocation.Server, VaryByParam = "name;city" }); page.ProcessRequest(HttpContext.Current); context.Response.ContentType = "application/json"; context.Response.BufferOutput = true; var searchTerm = (context.Request.QueryString["name"] + "").Trim(); var searchTerm2 = (context.Request.QueryString["city"] + "").Trim(); context.Response.Write(searchTerm+" "+searchTerm2+" "); context.Response.Write(DateTime.Now.ToString("s")); } public bool IsReusable { get { return false; } } private sealed class OutputCachedPage : Page { private OutputCacheParameters _cacheSettings; public OutputCachedPage(OutputCacheParameters cacheSettings) { // Tracing requires Page IDs to be unique. ID = Guid.NewGuid().ToString(); _cacheSettings = cacheSettings; } protected override void FrameworkInitialize() { base.FrameworkInitialize(); InitOutputCache(_cacheSettings); } } }