输出缓存,页面加载和回发 - 似乎有两个版本的页面缓存

时间:2012-02-10 19:56:03

标签: asp.net caching postback outputcache pageload

我正在学习ASP.NET输出缓存。

我整理了一个非常简单的页面(见下文)。测试无用;它只是为了说明这个问题的行为。

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ OutputCache Duration="60" 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></title>
            <script runat="server">
                protected void Page_Load(object sender, EventArgs e)
                {
                }
                protected void Button1_Click(object sender, EventArgs e)
                {
                    TextBox1.Text = Guid.NewGuid().ToString();
                }
            </script>
        </head>
        <body>
            <form id="form1" runat="server">
                <div>
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    <br />
                    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
                </div>
            </form>
        </body>
</html>

第一次加载页面时,文本框为空(如预期的那样)。

第一次单击该按钮时,文本框将填充SOMEGUID。从我的阅读中我预计它将保持空白...因为该页面应该是从缓存中提供的......?

对于后续按钮单击,文本框内容保持为SOMEGUID(直到缓存过期,在这种情况下它是SOMEOTHERGUID)。

如果我将页面加载到另一个浏览器选项卡(通过复制和粘贴URL),则texbox为空。

如果我单击新页面中的按钮,文本框内容将更改为SOMEGUID并保持这种状态(直到缓存过期,在这种情况下它是SOMEOTHERGUID)。

因此,缓存中似乎有两个版本;一个用于新加载的页面,另一个用于第一个按钮单击的结果?怎么了?我可以阻止它(用于实验目的)吗?我尝试将varyByControl属性设置为“none”,但它没有效果......

这类似于其他一些问题,几乎与output Caching and postback完全相同。但是,在我发现的类似问题中,没有一个包含完整的代码示例来说明行为,没有人接受答案。

更新:我还没有解决它或找到一篇讨论它的文章。我转向跟踪页面,看看是否有任何光线。但是,为每个回发生成一个新GUID的跟踪。谷歌搜索......

1 个答案:

答案 0 :(得分:1)

我在输出缓存实现(OutputCacheModule)中查看了一下,缓存键基于以下几点是唯一的,即:

  • 文件的路径
  • 动词(GET,POST等)
  • VaryBy设置及其结果值

在您的情况下,GET和POST最终会创建两个不同的缓存键。

此设计限制的解决方法已发布在this question