输出缓存在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);
}
}
答案 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();
}
}
在评论添加过滤器的行后,输出缓存开始按预期工作。