c# - mvc - asp net outputcache
Por qué GetVaryByCustomString no se llama (3)
Su definición de OutputCache es incorrecta. Debes especificar la Duration
:
[OutputCache(VaryByCustom = "user", Duration = 50)]
public ActionResult Index(string _entity, string id)
Ahora se GetVaryByCustomString
método GetVaryByCustomString
reemplazado. Además, no olvide que se GetVaryByCustomString
método GetVaryByCustomString
solo después de que la acción del controlador haya terminado de ejecutarse.
La memoria caché de salida se implementa en ASP.NET MVC2 usando el código a continuación.
GetVaryByCustomString
método GetVaryByCustomString
no se llama: colocar el punto de interrupción en su primera línea y la aplicación en ejecución muestra que no se alcanzó el punto de corte. Se alcanza el punto de interrupción en el índice del controlador ().
¿Cómo usar VaryByCustom
en ASP.NET MVC2?
Controlador:
[OutputCache(VaryByCustom = "user")]
public ActionResult Index(string _entity, string id)
{
...
Global.asax.cs:
public class MvcApplication : System.Web.HttpApplication
{
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "user")
{
HttpCookie cookie = context.Request.Cookies["Company"];
if (cookie != null)
return Thread.CurrentPrincipal.Identity.Name + "," + cookie.Value;
return Thread.CurrentPrincipal.Identity.Name;
}
return base.GetVaryByCustomString(context, arg);
}
}
Solo quiero mencionar otras 2 causas
Si hay algún atributo [NoCache] en el proyecto, GetVaryByCustomString no se activará .
Si pones
Location = OutputCacheLocation.Client,
GetVaryByCustomString no se activará .
Un proyecto en el que trabajé recientemente tenía un filtro global que impedía que el almacenamiento en caché de resultados funcionara:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new NoCacheResponseAttribute());
}
}
public class NoCacheResponseAttribute : BaseActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var response = filterContext.RequestContext.HttpContext.Response;
response.Cache.SetCacheability(HttpCacheability.NoCache);
response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
response.Cache.SetNoStore();
}
}
Después de comentar la línea que agrega el filtro, el almacenamiento en caché de salida comenzó a funcionar como se esperaba.