Cómo: Comprobar la validez de una página almacenada en la caché
Actualización: noviembre 2007
Cuando un usuario solicita una página almacenada en la memoria caché, ASP.NET determina si el resultado almacenado en la memoria caché aún es válido según la directiva de caché que se haya definido en la página. Si es válido, se envía el resultado almacenado en la memoria caché al cliente y no se vuelve a procesar la página. No obstante, ASP.NET proporciona la posibilidad de ejecutar código durante esta comprobación de validación mediante una devolución de llamada de validación, de modo que es posible escribir lógica personalizada para comprobar si la página es válida. La devolución de llamada de validación le permite invalidar páginas almacenadas en memoria caché fuera del proceso normal de utilización de dependencias de caché.
Para comprobar mediante programación la validez de una página almacenada en la caché
Defina un controlador de eventos de tipo HttpCacheValidateHandler e incluya código que compruebe la validez de la respuesta de una página almacenada en la caché.
El controlador de validación debe devolver uno de los siguientes valores de HttpValidationStatus:
Invalid Indica que la página almacenada en la memoria caché no es válida, se elimina la página de la memoria caché y la solicitud se trata como un error de caché.
IgnoreThisRequest Provoca que se trate la solicitud como un error de caché. Por consiguiente, la página se procesa de nuevo, pero no se invalida la página almacenada en la caché.
Valid Indica que la página almacenada en la memoria caché es válida.
En el ejemplo de código siguiente se muestra un controlador de validación denominado ValidateCacheOutput que determina si la variable de cadena de consulta status contiene los valores "invalid" (no válido) o "ignore" (omitir). Si el valor de estado es "invalid", el método devuelve Invalid y se invalida la página en la memoria caché. Si el valor de estado es "ignore", el método devuelve IgnoreThisRequest y se deja la página en la memoria caché, pero se genera una nueva respuesta para esta solicitud.
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
A partir de uno de los eventos del ciclo de vida de la página (como el evento Load de la página), llame al AddValidationCallback pasando como primer argumento el controlador de eventos que definió en el paso 1.
En el ejemplo de código siguiente se establece el método ValidateCacheOutput como controlador de validación.
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