我正在学习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的跟踪。谷歌搜索......
答案 0 :(得分:1)
我在输出缓存实现(OutputCacheModule)中查看了一下,缓存键基于以下几点是唯一的,即:
在您的情况下,GET和POST最终会创建两个不同的缓存键。
此设计限制的解决方法已发布在this question。