We do this by storing the rules (or similar) in the Application state.
We load the values in Session_Start (with a test to ensure that we only do it once) - I have a comment in Application_Start that states: "moved to session start because it seems to work better"
Something like this:
Application.Lock();
// Only load the rules if we haven't already
if (Application["RulesCache"] == null)
{
List<Rule> rules = LoadRules();
Application["RulesCache"] == rules;
}
Application.Unlock();
We're actually a little more sophisticated than this - but the basic premise is valid.
Pragmatically, you'd want to encapsulate the load into a separate routine and probably provide a mechanism to update the cache without having to restart the application