【问题标题】:.NET OutputCache directive not working.NET OutputCache 指令不起作用
【发布时间】:2015-04-20 15:05:24
【问题描述】:

我遇到了奇怪的缓存问题,并用输出缓存指令组合了一个非常简单的 .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 设置,找不到任何明显的设置来打开/关闭页面级缓存。我还广泛搜索了网络,似乎找不到其他人遇到此问题。

【问题讨论】:

    标签: asp.net caching outputcache ektron


    【解决方案1】:

    Microsoft 已禁用包含 cookie 的页面的输出缓存,以防止一个用户获取本应为其他用户使用的页面的缓存版本。

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

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

    【讨论】:

    • 我尝试了链接中的解决方法,它运行良好,尽管我必须添加一个测试来检查 PreSendRequestHeaders 方法中的 HttpContext.Current 是否为空,以避免在调试时出现异常。 cookie 可以解释为什么它在某些情况下有效,而在生产网站上也无效。
    • 该链接修复问题的解决方法,但我找不到任何官方解释说明 MS 为何这样做或这是否是一个有风险的修复。有什么想法吗?
    • 您只想在为访问您网站的任何人提供相同页面时使用页面输出缓存。如果您基于 cookie 或会话变量提供任何自定义内容,那么您不想使用此代码。危险在于,如果您根据 cookie 向人们提供不同的内容,您可能会向访问该页面的第二个人提供错误的内容。
    • 链接坏了,有谁知道解决方法是什么?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        相关资源
        最近更新 更多