6

我试图了解 ASP.NET OutputCache 机制。
我用标签和链接按钮构建了一个测试页面。
标签文本正在服务器上初始化,每个 PageLoad 上的当前服务器日期:

protected void Page_Load(object sender, EventArgs e)  
{  
    lblDate.Text = DateTime.Now.ToString();  
}

我使用了这个指令:<%@ OutputCache Duration="600" VaryByParam="none"%>

当我第一次按下 LinkBut​​ton 时,我在标签中得到了一个新文本,但是如果我再次按下链接按钮,我就没有得到一个新文本。

我认为这是因为传输到服务器的参数对于每个回发都是相同的。

有什么方法可以使用 OutputCach 和回发控件吗?

4

3 回答 3

7

对,事情是你改变了 NO 参数,所以第一个请求的响应 html 被缓存并在接下来的 10 分钟内提供服务(理论上)。如果您想缓存 GET 但处理不同的 POST,您应该根据您的 POST 参数而有所不同。

让我给你举个例子。您有一个文本输入,用于在 POST 上发送包含其内容的电子邮件。如果您因该输入名称而异,则在缓存时间跨度内具有该文本输入的不同值的每个请求都会命中您的处理程序并处理发送电子邮件。

另一方面,您可能会因 * 而异,但您会失去内核模式缓存。

于 2009-07-21T15:34:47.997 回答
3

你的假设是正确的。

您的 OutputCache 指令告诉输出缓存机制为特定 URL缓存整个呈现页面 600 秒。

在您的简单示例中,您可能没有使用任何查询字符串,但是,指令中的 VaryByParam 声明允许您指定查询字符串参数,以确保单独缓存该参数的每个不同值。例如,如果您有:

<%@ OutputCache Duration="600" VaryByParam="ProductID"%>

那么这三个不同的 URL 将被单独缓存,并且将“ProductID”参数的值更改为尚未缓存的值将确保页面由 ASP.NET 运行时正确处理和呈现:

http://www.example.com/viewproduct.aspx?ProductID=123
http://www.example.com/viewproduct.aspx?ProductID=3
http://www.example.com/viewproduct.aspx?ProductID=67

在您的示例中,在您的按钮单击时,该页面之前已经呈现(并缓存)并且当您再次回发时,您回发并有效重新加载的 URL 没有区别,因此,ASP.NET 运行时将向您显示缓存的页面,而无需重新渲染它。

除了通过更改“VaryByParam”参数的值之外,OutputCache 指令在页面缓存方面是相当多的“全有或全无”方法。但是,该指令有一个“VaryByContol”属性,它只能用于 ASP.NET 用户控件,而不是一个完整的 ASP.NET 网页。

从您的问题来看,听起来您更像是需要调查部分页面缓存。当某些事件发生时,该机制或使缓存无效的机制。这通常是通过添加“缓存依赖项”来完成的。

为此,以下链接应该有所帮助:

缓存 ASP.NET 页面的部分
提示/技巧:使用 ASP.NET 2.0 输出缓存替换功能实现“甜甜圈缓存”以
编程方式从 OutputCache 中删除页面

于 2009-07-21T15:16:07.643 回答
0

您需要的是缓存后替换:

动态更新缓存页面的部分

于 2009-07-21T15:15:24.367 回答