ASP.NET allows you to cache pages. The means that when the code behind the page
runs, it produces HTML, the HTML is sent down to the client, however a copy is
stored in the memory of the web server. If the same page is requested again,
then the page is retrieved from the cache and the code is not rerun. You have
virtually infinite flexibility on controlling when the cache gets flushed.

The most basic caching is implemented by placing this line at the top of your
ASPX page:

<%@ OutputCache Duration="3600" VaryByParam="none"%>

What this tells the ASP.NET caching code is to cache the page for one hour.

Location allows the caching to occur on the server, on the client, on a
proxy server in between. The default is Any. If you always want server caching
(which seems to me to be the most useful choice), change the line to read:

VaryByControl is only used by user controls, not on standard web pages.
See the .NET documentation for more details.

VaryByCustom="browser" keeps a different copy of the output for each
browser name and major version information. So if you have cloaking by browser
version going on (which is easy to implement in .NET), then each separate page
will get delivered.

VaryByCustom="customstring" Allows you to specify a string that will be
passed to your code. To make this useful, you must then override the
GetVaryByCustomString method in the Global.asax file. For example, place this
line in your ASPX file:

VaryByHeader allows you to cache based off of some field in the HTTP
header sent by the client. The classic example is based off the Accept-Language
header line.

VaryByParam allows you to cache different versions based off of
querystring or post field parameters. So http://www.domain.com/foo.aspx?bar=baz
would be cached separately from http://www.domain.com/foo.aspx?bar=bletch