This site runs on a mini pc (read about that here) with a sqlite database, so the odds are not in my favor when it comes to fast page loads. While I am probably the only one reading my site at this point, I despise waiting for web pages to load. So in order to keep my reader happy, I have employed a couple strategies that have helped improve site performance quite a bit.
Output Caching via ASP.NET MVC’s OutputCache Attribute
The OutputCache attribute is a very simple way to layer in server-side caching of ASP.NET MVC routes. There are a ton of options with this approach, but for this application my needs were simple. First up, I needed to cache rendered views, but not the same rendering for all users. In this case I used the VaryByCustom parameter and implemented it to ready the requesting user’s Identity info. For this site, that basically means authenticated vs. unauthenticated users. Secondly, I needed to store some dynamically generated images that I only wanted cached on the server so that the client would retrieve the latest available version.
There are some options on how to implement this Attribute, but I strongly recommend only using the CacheProfile approach so that your cache setting particulars can be separate from your code.
That means a new section in your web.config, inside <system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="UserCache" duration="600" location="ServerAndClient" varyByCustom="User"/>
<add name="ImageCache" duration="60" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
With that config shown above, I then can apply my caching attributes to any actions I want.
[OutputCache(CacheProfile = "UserCache")]
public ActionResult About()
{
}
[OutputCache(CacheProfile = "ImageCache")]
public ActionResult FreeMem()
{
}
In order to correctly complete the VaryByCustom logic, I overrode the GetVaryByCustomString method in Global.asax.
public override string GetVaryByCustomString(HttpContext context, string custom)
{
return "User".Equals(custom, StringComparison.OrdinalIgnoreCase)
? User.Identity.Name
: base.GetVaryByCustomString(context, custom);
}
Read the docs for more info on OutputCache here: https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.outputcacheattribute?view=aspnet-mvc-5.2
Priming via “KeepAlive” Task Scheduler Tasks
With all of that caching weaved in place, I can keep the site “warmed up” and ready for that dedicated reader. I used Windows built in Task Scheduler and a couple powershell scripts for this purpose.
One example of such script is keepAlive.ps1
Invoke-WebRequest http://www.recursv.com/
Then in Task Scheduler create a task that runs a program, in this case powershell.exe, with the arguments “-ExecutionPolicy Bypass -File C:\Users\Aaron\scripts\keepAlive.ps1” and run it every 5 minutes.
There you have it, quick page loads even from my anemic little server.