为什么不调用GetVaryByCustomString

时间:2012-10-17 09:47:50

标签: c# asp.net-mvc asp.net-mvc-2 outputcache

输出缓存在ASP.NET MVC2中使用以下代码实现。

不调用

GetVaryByCustomString方法:将断点放在第一行,运行应用程序显示未到达断点。 到达控制器Index()中的断点。

如何在ASP.NET MVC2中使用VaryByCustom

控制器:

        [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);
    }

}

3 个答案:

答案 0 :(得分:8)

您的OutputCache定义错误。您必须指定Duration

[OutputCache(VaryByCustom = "user", Duration = 50)]
public ActionResult Index(string _entity, string id)

现在将调用被覆盖的GetVaryByCustomString方法。另外,请不要忘记仅在控制器操作执行完毕后才会调用GetVaryByCustomString方法。

答案 1 :(得分:1)

我只想提及其他两个原因

如果项目中有 [NoCache] 属性, GetVaryByCustomString 将不会触发。

如果你把

Location = OutputCacheLocation.Client, 

GetVaryByCustomString 不会触发。

答案 2 :(得分:0)

我最近工作的一个项目有一个全局过滤器阻止输出缓存起作用:

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();
    }
}

在评论添加过滤器的行后,输出缓存开始按预期工作。