Outputcache 1 个动作,2 个视图

Outputcache 1 action, 2 views

所以我有以下操作,我正在尝试将输出缓存添加到:

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24)]
public ActionResult ContactUs()
{
  ContactUsModel model = _modelBuilder.BuildContactUsModel();

  if (Request.IsAjaxRequest())
  {
    return Json(StringFromPartial(partialTemplate, model), JsonRequestBehavior.AllowGet);
  }
  else
  {
    return View(model);
  }
}

但这似乎缓存了请求的第一个视图 - 即 json 普通视图。

有没有办法让输出缓存对两个视图都起作用,而不必将它们从同一操作中分离出来?

感谢 REDEVI_ 的评论为我指明了正确的方向,我已经能够解决这个问题。

我将输出缓存更改为:

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24, VaryByCustom = "IsAjax")]

然后在我的 global.asax 文件中,我添加了以下覆盖:

    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (context != null)
        {
            switch (custom)
            {
                case "IsAjax":
                    return new HttpRequestWrapper(context.Request).IsAjaxRequest() ? "IsAjax" : "IsNotAjax";
            }
        }

        return base.GetVaryByCustomString(context, custom);
    }

你抢先回答了你自己的问题,但我认为这段代码可能仍然有用。由于因用户而异是一种常见的情况,因此您可能应该考虑到能够做到这一点 您的 AJAX 变化。此代码将允许您通过附加到单个字符串来改变任意数量的自定义参数。

public override string GetVaryByCustomString(System.Web.HttpContext context, string custom)
{
    var args = custom.ToLower().Split(';');
    var sb = new StringBuilder();

    foreach (var arg in args)
    {
        switch (arg)
        {
            case "user":
                sb.Append(User.Identity.Name);
                break;
            case "ajax":
                if (context.Request.Headers["X-Requested-With"] != null)
                {
                    // "XMLHttpRequest" will be appended if it's an AJAX request
                    sb.Append(context.Request.Headers["X-Requested-With"]);
                }
                break;
            default:
                continue;
        }
    }

    return sb.ToString();
}

然后,如果您需要改变多个自定义参数,您只需执行以下操作即可。

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24, VaryByCustom = "User;Ajax")]

然后,如果您需要额外的自定义 vary 参数,您只需不断添加 case 语句来涵盖这些场景。