2012-05-14 8 views
7

tengo memoria caché de salida habilitada en una de las páginas de la siguiente manera:invalida salida caché si hay una excepción en la página

<%@ OutputCache Duration="300" VaryByParam="*"%> 

El problema es que a veces no es una excepción y nos mostrará un mensaje apropiado. Pero esta página se almacena en caché y otros usuarios también ven el mensaje de excepción. Por ejemplo, supongamos que la base de datos agota el tiempo de espera y, por lo tanto, se lanza una excepción Sql. Esta excepción se detecta y se muestra un mensaje "Error al conectarse a la base de datos. Inténtelo después de un tiempo". Ahora este mensaje se almacena en caché y se muestra a otros usuarios sin siquiera consultar la base de datos.

Lo que quiero hacer es invalidar el caché de salida particular si hay una excepción, o tal vez no caché cuando hay una excepción. ¿Cómo puede hacerse esto?

Esto es para ASP.NET 3.5 Webforms.

Respuesta

5

Usted debe ser capaz de eliminar el elemento de la caché

HttpResponse.RemoveOutputCacheItem("/MyPage/MyParameter"); 
+1

+1 pero ¿cuál es el mejor lugar para activar todas las excepciones? En el manejador de excepciones del objeto de la aplicación, o en algún lugar de la página, o finalmente en el método del controlador (si es MVC, y si no es demasiado pronto) o en otro lugar. – Rup

2

Suponiendo sus excepciones llegan a Application_Error en Global.asax, puede intentar lo siguiente:

public void Application_Error(Object sender, EventArgs e) { 
    ... 

    Response.Cache.AddValidationCallback(
     DontCacheCurrentResponse, 
     null); 

    ... 
} 

private void DontCacheCurrentResponse(
    HttpContext context, 
    Object data, 
    ref HttpValidationStatus status) { 

    status = HttpValidationStatus.IgnoreThisRequest; 
} 

Esto se asegurará de que el próximo la respuesta no se publicará desde la memoria caché, pero llegará a su página/controlador.

Cuestiones relacionadas