压缩/缓存和请求对象无法一起使用ASP.NET

时间:2013-11-28 10:49:11

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我对ASP.NET应用程序有轻微的问题,

我已经配置了一个ViewBag变量来发送到我的View(使用razor)与查询字符串的下一页链接但是在启用此属性时:

public class CompressAttribute : System.Web.Mvc.ActionFilterAttribute
  {
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      #region Cache
      HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(1));
      HttpContext.Current.Response.Cache.SetValidUntilExpires(true);
      HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
      HttpContext.Current.Response.Cache.VaryByHeaders["Accept-Encoding"] = true;
      #endregion
      #region Compression
      var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
      if (string.IsNullOrEmpty(encodingsAccepted)) return;

      encodingsAccepted = encodingsAccepted.ToLowerInvariant();
      var response = filterContext.HttpContext.Response;

      if (encodingsAccepted.Contains("deflate"))
      {
        response.AppendHeader("Content-Encoding", "deflate");
        response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
      }
      else if (encodingsAccepted.Contains("gzip"))
      {
        response.AppendHeader("Content-Encoding", "gzip");
        response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
      }
      #endregion
    }
  }

该网站并未完全处理以下声明:

ViewBag.NextPageLink = "/" + culture + "/next/" + pageName + Request.Url.Query;

它只生成链接:/ culture / next / pageName但不包含查询字符串(它标记为空)。

我的CompressAttribute中有什么可以导致这种情况吗?因为在禁用它时显然可以重定向。

编辑:

似乎缓存是有原因的。当重新加载具有不同查询的页面时,服务器可能不会重新呈现此链接。

1 个答案:

答案 0 :(得分:0)

即使查询字符串已更改,服务器也会返回相同的缓存页面。 要告诉服务器更改每个查询字符串的缓存,请使用HttpCacheVaryByParams

示例:

HttpContext.Current.Response.Cache.VaryByParams["*"] = true; //* means all params

顺便说一下,您可能希望使用OutputCacheAttribute和IIS Compression而不是自己滚动。