.NET OutputCache 指令不起作用

.NET OutputCache directive not working

我遇到了奇怪的缓存问题,因此我将一个非常简单的 .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 通常也不起作用,除了在一个完全按照上述配置的测试页面上。我不明白为什么那个页面不同,并且是唯一一个在开发服务器上工作的页面,但是当复制到我本地主机上的站点 运行 时,它不再工作了。

我确实注意到,在我们的生产站点上,使用母版页似乎会使输出缓存不起作用,但在这个本地主机站点中,我没有使用母版页,它仍然不起作用。

我应该从哪里着手解决这个问题?我查看了 IIS 设置,但找不到任何明显的设置来打开 on/off 页面级缓存。我也在网上进行了广泛的搜索,但似乎找不到其他人遇到这个问题。

在您的定义中添加 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>

Microsoft 已禁用包含 cookie 的页面的输出缓存,以防止一个用户获取用于另一个用户的页面的缓存版本。

有一种解决方法可以从输出中删除 cookie。 看 https://support.episerver.com/hc/en-us/articles/115004119986-Output-Caching-Broken

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

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

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

因此,只需在您的代码中查找即可。如果您需要缓存覆盖此调用。