我正在尝试理解ASP.NET OutputCache机制 我用Label和LinkButton构建了一个测试页面 标签文本正在服务器上初始化,每个PageLoad上都有当前服务器日期:
protected void Page_Load(object sender, EventArgs e)
{
lblDate.Text = DateTime.Now.ToString();
}
我使用了这个指令:<%@ OutputCache Duration="600" VaryByParam="none"%>
当我第一次在Label中获取新文本时按下LinkButton,但如果我再次按下linkbutton,我就不会收到新文本。
我认为这是因为传输到服务器的参数对于每个回发都是相同的。
有没有办法使用OutputCach和回发控件?
答案 0 :(得分:6)
是的,你可以通过NO参数改变,所以第一个请求的响应html被缓存并在接下来的10分钟内服务(理论上)。如果您想缓存GET但处理不同的POST,则应根据POST参数进行更改。
让我举个例子。您有一个文本输入用于在POST时发送包含其内容的电子邮件。如果您根据该输入名称进行了更改,则缓存时间范围内的每个请求都会显示该文本输入的不同值,这会触发您的处理程序并处理发送电子邮件。
另一方面,你可能会因*而异,但是你会失去内核模式缓存。
答案 1 :(得分:2)
你的假设是正确的。
您的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网页。
从您的问题来看,这听起来更像是您需要调查部分页面缓存。某个事件发生时使缓存无效的机制或机制。这通常通过添加“缓存依赖”来完成。
为此,以下链接应该有所帮助:
Caching Portions of an ASP.NET Page
Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature
Programmatically Removing a Page from the OutputCache
答案 2 :(得分:0)
您需要的是缓存后替换: