Server-side and client-side caching in ASP.NET
发表于 2014-04-13

Caching is a very easy solution to many performance related issues on almost any website. There are many different ways to use server-side caching and they all have their own unique advantages. But client-side caching is often ignored in the .NET blogosphere even though it is just as important as the server-side cache.

Everywhere server-side caching is used you can and should use client-side caching as well. Even though the server can serve cached ASP.NET pages very fast it still rely on the browser to download and render the output. When adding client-side caching you get an enormous performance benefit when the page is visited more than once by the same browser.

Firefox and IE6/7 has a slightly different way of interpret client-side caching, so you have to implement it correct to get it to work in both browsers. Here is an example of a method that caches the page on the client based on a date. The date should be the exact date of the last time the content changed.

private void SetClientCaching(DateTime lastModified)

{

 Response.Cache.SetETag(lastModified.Ticks.ToString());

 Response.Cache.SetLastModified(lastModified);

 Response.Cache.SetCacheability(HttpCacheability.Public);

 Response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0));

 Response.Cache.SetSlidingExpiration(true);

}

If you use a HTTP Handler (.ashx) or some other means to serve files – it could be XML-files – it could be a good idea to do a server-side caching as well. Here’s a method you can call that does just that:

private void SetFileCaching(string fileName)

{

 Response.AddFileDependency(fileName);

 Response.Cache.SetETagFromFileDependencies();

 Response.Cache.SetLastModifiedFromFileDependencies();

 Response.Cache.SetCacheability(HttpCacheability.Public);

 Response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0));

 Response.Cache.SetSlidingExpiration(true);

}

You could use the same method to do standard output caching including client-side caching. >

SetFileCaching(Request.PhysicalPath);

That makes it more powerful than the regular output cache, because it provides client-side caching as well. As mentioned before, there are a lot of ways to use the different kinds of caching and they all bring something to the plate. The code in this example is something I use all the time because it works great for the projects I work on. In the end it is a personal choice.