why, in the below aspx and code behind, when Output Caching is enabled programmatically (enabled in code behind), it does not work and has a problem?
aspx:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="ProgrammaticOutputCaching"
CodeBehind="ProgrammaticOutputCaching.aspx.cs" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblDate" runat="server" Font-Bold="False" Font-Names="Verdana" Font-Size="XX-Large"></asp:Label><br />
<br />
<asp:Button ID="Button1" runat="server" Text="Refresh" />
</div>
</form>
</body>
</html>
code behind:
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.Public);
// Use the cached copy of this page for the next 60 seconds.
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
//Response.Cache.VaryByParams.IgnoreParams = true;
// This additional line ensures that the browser can't
// invalidate the page when the user clicks the Refresh button
// (which some rogue browsers attempt to do).
Response.Cache.SetValidUntilExpires(true);
lblDate.Text = "The time is now:<br>" + DateTime.Now.ToString();
}
with page directive for output caching there is no problem:
mean
aspx:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="OutputCaching" CodeBehind="OutputCaching.aspx.cs" %>
<%@ OutputCache Duration="60" VaryByParam="Name;Age" Location="Server" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblDate" runat="server" Font-Bold="False" Font-Names="Verdana"
Font-Size="XX-Large"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Refresh" />
</div>
</form>
</body>
</html>
and
code behind:
protected void Page_Load(object sender, EventArgs e)
{
lblDate.Text = "The time is now:<br>";
lblDate.Text += DateTime.Now.ToString();
}
so what is the problem about programmatically?
Response.Cache
All these methods do is modifiy the HTTP headers in the response which ask the browser to do something (in this case modifiy how it cache's).
Have you used Fiddler to see these?
I would guess that ASP.net has changed the last-modified date (since it knows the time has changed), however there's a few reasons why the browser would still update:
I suggest you research some of these points, however you definitely shouldn't be relying on the browsers cache to ensure the functionality of your app.