.NET OutputCache指令不起作用

时间:2015-04-20 15:05:24

标签: asp.net caching outputcache ektron

我一直遇到奇怪的缓存问题,并将一个非常简单的.NET页面与输出缓存指令组合在一起。但是,页面不缓存(每次刷新时内容都会更新)。

我的本​​地计算机(Windows 7)上安装了一个简单,最小的CMS(Ektron v.9.0 SP2)站点。在这个网站项目中,我创建了一个用于测试输出缓存的简单页面。这是页面代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CacheTest.aspx.cs" Inherits="CacheTest" %>
<%@ OutputCache Duration="3600" Location="Server" VaryByParam="None" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Cache Test</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p><%= DateTime.Now.ToString() %></p>
    </div>
    </form>
</body>
</html>

此页面根本不缓存。

在我们的生产站点上,OutputCache通常也不起作用,除了在一个完全像上面配置的测试页面上。我无法弄清楚为什么一个页面是不同的,并且是唯一一个在开发服务器上工作但是当复制到我的localhost上运行的站点时,它不再起作用。

我注意到在我们的生产网站上,使用母版页似乎使输出缓存无法正常工作,但在此localhost网站中我没有使用母版页,但它仍然无效。

我应该从哪里开始寻找解决此问题的方法?我查看了IIS设置,无法找到任何明显的设置来打开/关闭页面级缓存。我也在广泛搜索网页,似乎找不到其他人。

3 个答案:

答案 0 :(得分:5)

Microsoft已禁用包含Cookie的网页的输出缓存,以防止一个用户获取适用于其他用户的页面的缓存版本。

有一种解决方法可以从输出中删除Cookie。 看到 https://support.episerver.com/hc/en-us/articles/115004119986-output-caching-broken

作为替代方案,您还可以通过缓存用户控件来使用部分页面缓存。

答案 1 :(得分:0)

在定义中添加CacheProfile属性,

<%@ OutputCache CacheProfile="CacheOneHour" Duration="3600" Location="Server" VaryByParam="none" %>

在Web.config文件中声明缓存配置文件。 (在system.web中,放置您的声明):

  <system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="CacheOneHour"
               duration="3600"
               location="Server"
               varyByParam="none" />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
  </system.web>

答案 2 :(得分:0)

我遇到了类似的问题。问题是在基页上停止了缓存。

public static void StopCachingOfPage()
        {
            // Stop Caching in IE 
            HttpContext.Current.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
            // Stop Caching in Firefox 
            HttpContext.Current.Response.Cache.SetNoStore();
        }

所以只需在代码中查找。如果您需要缓存覆盖此调用。