2015-04-20 56 views
4

我一直有奇怪的缓存问题,并与一个输出缓存指令组成一个非常简单的.NET页面。但是,页面没有缓存(每次刷新时都会更新内容)。NET OutputCache指令不工作

我在我的本地计算机(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一般也不起作用,除非在一个测试页上配置完全像上面那样。我找不出为什么这个页面是不同的,并且是唯一一个在dev服务器上工作的人,但是当被复制到在本地主机上运行的站点时,它不再工作。

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

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

回答

5

微软在包括饼干,以防止一个用户从得到的是本来是为其他用户页面的缓存版本的页面禁用输出缓存。

有一种解决方法可以从输出中删除Cookie。 见 https://world.episerver.com/KB/10131/

作为替代方案,你也可以使用通过缓存用户控件的部分页面缓存。

+0

我在链接中尝试了解决方法,它完美地工作,尽管我必须添加一个测试来检查HttpContext.Current在PreSendRequestHeaders方法中是否为null,以避免在调试时出现异常。饼干可以解释为什么它可以在某些情况下工作,而不是生产网站上的其他人。 – user0474975

+0

该链接解决了问题的解决方法,但我无法找到任何有关MS为什么会这样做的官方解释,或者这是否是一个危险的修复程序。有任何想法吗? – Lavamantis

+0

当您向访问您的网站的任何人提供同一页面时,您只想使用页面输出缓存。如果您正在基于Cookie或会话变量提供任何自定义内容,那么您不想使用此代码。危险是如果你根据他们的cookie向人们提供不同的内容,你可能会向访问该页面的第二人提供错误的内容。 – maddoxej

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

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