ASP.NET MVC cómo deshabilitar la opción de almacenamiento automático en caché?
c#-4.0 caching (5)
HackedByChinese está perdiendo el punto. Él confundió el caché del servidor con el caché del cliente. OutputCacheAttribute controla el caché del servidor (IIS http.sys cache), no el caché de los navegadores (clientes).
Te doy una pequeña parte de mi código base. Úsalo con sabiduría.
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class NoCacheAttribute : FilterAttribute, IResultFilter
{
public void OnResultExecuting(ResultExecutingContext filterContext)
{
}
public void OnResultExecuted(ResultExecutedContext filterContext)
{
var cache = filterContext.HttpContext.Response.Cache;
cache.SetCacheability(HttpCacheability.NoCache);
cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
cache.SetExpires(DateTime.Now.AddYears(-5));
cache.AppendCacheExtension("private");
cache.AppendCacheExtension("no-cache=Set-Cookie");
cache.SetProxyMaxAge(TimeSpan.Zero);
}
}
Uso:
/// will be applied to all actions in MyController
[NoCache]
public class MyController : Controller
{
// ...
}
Úselo sabiamente ya que realmente deshabilita todo el caché del cliente. El único caché no deshabilitado es el caché del navegador "botón de retroceso". Pero parece que realmente no hay forma de evitarlo. Tal vez solo mediante el uso de javascript para detectarlo y forzar la actualización de zonas de páginas o páginas.
¿Cómo deshabilitar el almacenamiento en caché automático del navegador desde la aplicación asp.Net mvc?
Porque tengo un problema con el almacenamiento en caché ya que guarda en caché todos los enlaces. Pero a veces se redirigía automáticamente a la PÁGINA POR ÍNDICE POR DEFECTO, que almacenaba el almacenamiento en caché y, luego, todo el tiempo que hago clic en ese enlace me redirige a la PÁGINA INDICADA POR OMISIÓN.
Entonces, ¿alguien sabe cómo deshabilitar manualmente la opción de almacenamiento en caché de ASP.NET MVC 4?
Para la solución en la página, configúrelo en su página de diseño:
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
Podemos configurar el perfil de caché en el archivo Web.config en lugar de establecer los valores de caché individualmente en las páginas para evitar el código redundante. Podemos referir el perfil utilizando la propiedad CacheProfile del atributo OutputCache. Este perfil de caché se aplicará a todas las páginas a menos que la página / método anule estas configuraciones.
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheProfile" duration="60" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
Y si desea deshabilitar el almacenamiento en caché de su acción o controlador en particular, puede anular la configuración de la memoria caché decorando ese método de acción específico como se muestra a continuación:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult NoCachingRequired()
{
return PartialView("abcd");
}
Espero que esto sea claro y te sea útil.
Si desea evitar el almacenamiento en caché del navegador, puede usar este código de ShareFunction
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
Puede usar OutputCacheAttribute
para controlar el almacenamiento en caché del servidor y / o el navegador para acciones específicas o todas las acciones en un controlador.
Deshabilitar para todas las acciones en un controlador
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration
public class MyController : Controller
{
// ...
}
Deshabilitar para una acción específica:
public class MyController : Controller
{
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only
public ActionResult Index()
{
return View();
}
}
Si desea aplicar una estrategia de almacenamiento en caché predeterminada a todas las acciones en todos los controladores, puede agregar un filtro de acción global editando su global.asax.cs
y buscando el método RegisterGlobalFilters
. Este método se agrega en la plantilla de proyecto de la aplicación MVC predeterminada.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new OutputCacheAttribute
{
VaryByParam = "*",
Duration = 0,
NoStore = true,
});
// the rest of your global filters here
}
Esto hará que aplique el OutputCacheAttribute
especificado anteriormente a cada acción, lo que deshabilitará el almacenamiento en caché del servidor y del navegador. Debería poder sobrescribir este no-caché agregando OutputCacheAttribute
a acciones y controladores específicos.