輸出緩衝是一種功能強大的技術,它通過緩衝從動態網頁產生的內容來提高請求/響應的輸送量。預設情況下啟用輸出緩衝,但不緩衝來自任何給定響應的輸出,除非採取顯式操作使該響應成為可快取的。
若要使響應滿足輸出緩衝的條件,它必須具有有效到期/有效性策略和公用的緩衝可見度。這可通過使用低層級的 OutputCache API 或進階別的 @ OutputCache 指令來實現。 啟用輸出緩衝後,當發出對頁的第一個 GET 請求時建立一個輸出快取項目。隨後的 GET 或 HEAD 請求由該輸出快取項目服務,直到該緩衝請求到期。
輸出緩衝還支援緩衝的 GET 或 POST 成對的名稱和數值的變體。
輸出緩衝遵循頁的到期和有效性策略。如果某頁位於輸出緩衝中,並且有一個到期策略標記指示該頁自緩衝起 60 分鐘後到期,則在 60 分鐘後將該頁從輸出緩衝中移除。如果此後接收到另一個請求,則執行頁代碼,並且可以再次緩衝該頁。這種到期策略稱為絕對到期,即頁在某個確定的時間之前有效。
下面的樣本說明用 @ OutputCache 指令輸出緩衝響應的簡單方法。此樣本僅顯示產生響應的時間。若要查看輸出緩衝的運行情況,請調用該頁並注意產生響應的時間。然後重新整理該頁並注意原來的時間沒有更改,表明輸出緩衝正在為第二個響應服務。
下面的指令在響應時啟用輸出緩衝:
<%@ OutputCache Duration="60" VaryByParam="none"%>
此指令僅指示頁應緩衝 60 秒,而且頁不隨任何 GET 或 POST 參數改變。在該頁仍被緩衝時接收到的請求由快取服務。60 秒後,從緩衝中移除該頁;將顯式處理下一個請求並再次快取頁面。
當然,在上例中,輸出緩衝幾乎沒有省去任何工作。下面的樣本顯示相同的輸出緩衝技術,但查詢一個資料庫並將結果顯示在網格中。
在最後的樣本中,對應用程式做了輕微的修改,使使用者可以有選擇地查詢各個州的作者。此樣本說明如何使用 @ OutputCache 指令的 VaryByParam 屬性,緩衝隨查詢字串中的成對的名稱和數值值變化的請求。
<%@ OutputCache Duration="60" VaryByParam="state" %>
對於資料集中的每個州,都有一個將所需的州作為查詢字串的一部分進行傳遞的連結。應用程式然後構造合適的資料庫查詢,並顯示僅屬於選定州的作者。
注意,當您第一次單擊給定州的連結時,它在頁的底部產生一個新的時間戳記。此後,每當在一分鐘內重新提交對該州的請求時,都會得到原來的時間戳記,表示該請求已被緩衝。
應用程式若要更多地控制與緩衝相關的 HTTP 標題,可使用 System.Web.HttpCachePolicy 類提供的功能。下面的樣本顯示等效於上例中使用的頁指令的代碼。
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)) Response.Cache.SetCacheability(HttpCacheability.Public)
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public); |
| C# |
VB |
JScript |
|
若要使之成為變化的到期策略(即每次請求頁時都重新設定到期時間),請按以下代碼所示來設定 SlidingExpiration 屬性。
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetSlidingExpiration(true);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)) Response.Cache.SetCacheability(HttpCacheability.Public) Response.Cache.SetSlidingExpiration(True)
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetSlidingExpiration(true); |
| C# |
VB |
JScript |
|
注意:啟用變化的到期後 (SetSlidingExpiration(true)),對原伺服器的請求總是會產生一個響應。在下遊緩衝可滿足用戶端請求(緩衝中的內容尚未到期)而無須從原伺服器請求內容的情況下,使用變化的到期時間是很有用的。
從 ASP 移植過來的應用程式可能已用 ASP 屬性設定了緩衝策略;例如:
Response.CacheControl = "Public"; Response.Expires = 60;
Response.CacheControl = "Public" Response.Expires = 60
Response.CacheControl = "Public"; Response.Expires = 60; |
| C# |
VB |
JScript |
|
這些屬性受 ASP.NET 的支援,並且具有同已顯示的其他樣本相同的作用。
本節小結
- 輸出緩衝技術緩衝由 ASP.NET 頁產生的內容。
- 除非頁具有有效到期時間或有效性策略和公用的緩衝可見度,否則不將其放入輸出緩衝。