HOW TO:檢查快取網頁的有效性
更新:2007 年 11 月
當使用者要求快取網頁時,ASP.NET 會根據您在網頁中定義的快取原則判斷快取輸出是否仍有效。如果輸出有效,則會將快取輸出傳送至用戶端,且不會重新處理該網頁。不過,ASP.NET 會為您提供在這個驗證檢查期間使用驗證回呼 (Callback) 執行程式碼的能力,以便您可以撰寫自訂邏輯以檢查網頁是否有效。驗證回呼允許您讓使用快取相依性之正常處理序之外的快取網頁失效。
若要以程式設計方式檢查快取網頁的有效性
定義型別 HttpCacheValidateHandler 的事件處理常式,並加入檢查快取網頁回應之有效性的程式碼。
驗證處理常式必須傳回下列其中一個 HttpValidationStatus 值:
Invalid:表示快取網頁無效,該網頁從快取收回,而要求則當做快取遺失處理。
IgnoreThisRequest:使要求視為快取遺失,因此會重新處理網頁,但是快取網頁並未失效。
Valid:表示快取網頁有效。
在下列程式碼中,示範了名為 ValidateCacheOutput 的驗證處理常式,其判斷查詢字串變數 status 包含的值是 "invalid" 還是 "ignore"。如果狀態值為 "invalid",則方法會傳回 Invalid,且網頁在快取中無效。如果狀態值為 "ignore",則方法會傳回 IgnoreThisRequest,且網頁會保留在快取中,但會為這個要求產生新的回應。
public static void ValidateCacheOutput(HttpContext context, Object data, ref HttpValidationStatus status) { if (context.Request.QueryString["Status"] != null) { string pageStatus = context.Request.QueryString["Status"]; if (pageStatus == "invalid") status = HttpValidationStatus.Invalid; else if (pageStatus == "ignore") status = HttpValidationStatus.IgnoreThisRequest; else status = HttpValidationStatus.Valid; } else status = HttpValidationStatus.Valid; }
Public Shared Sub ValidatePage(ByVal context As HttpContext, _ ByVal data As [Object], ByRef status As HttpValidationStatus) If Not (context.Request.QueryString("Status") Is Nothing) Then Dim pageStatus As String = context.Request.QueryString("Status") If pageStatus = "invalid" Then status = HttpValidationStatus.Invalid ElseIf pageStatus = "ignore" Then status = HttpValidationStatus.IgnoreThisRequest Else status = HttpValidationStatus.Valid End If Else status = HttpValidationStatus.Valid End If End Sub
從其中一個網頁生命週期事件 (例如,網頁的 Load 事件),呼叫 AddValidationCallback 方法,將您在步驟 1 中定義的事件處理常式做為第一個引數傳遞。
在下列程式碼中,設定了 ValidateCacheOutput 方法做為驗證處理常式。
protected void Page_Load(object sender, EventArgs e) { Response.Cache.AddValidationCallback( new HttpCacheValidateHandler(ValidateCacheOutput), null); }
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Response.Cache.AddValidationCallback( _ New HttpCacheValidateHandler(AddressOf ValidatePage), Nothing) End Sub