The cache tag helper enables you to cache regions of a Razor page in memory on the server. Typical uses for this helper are for View Components or partial views that require relatively expensive database or web service calls, but where the content doesn't change very often. This type of caching its primarily used to improve a website's performance.
Unlike most other tag helpers, the Cache tag helper doesn't target a standard HTML element. It targets the
<cache> tag, which is not rendered to the browser and doesn't appear in the HTML source either.
The cache tag helper uses an in-memory-based store for content. This is volatile and can be cleared unexpectedly for any number of reasons, including app pool recycling, server restarts, low memory pressure and so on. The cache tag helper is not intended to be used for reliable long term storage.
||Used to specify if this tag is enabled or not|
||Specifies the period of time after which the cached item should expire|
||Specifies the time at which the cached entry should expire|
||The period of time after the last access that the item should expire|
||Used to specify the parameters that determine whether different versions of the same content should be cached|
The cache tag helper is enabled by default. You might want to conditionally disable it under certain circumstances. The
enabledattribute facilitates this. The cached item in this example is disabled on Sundays:
<cache enabled="DateTime.Now.DayOfWeek != DayOfWeek.Sunday">@DateTime.Now</cache>
If you don't provide values for any of the
expires-*attributes, your item will be cached without an expiration date, meaning that it will only expire when the memory store is cleared. The
expires-afterattribute takes a
TimeSpanvalue that represents the period of time that the item should be stored in the cache. This example shows the item being stored for 1 hour:
expires-onattribute takes a
DateTimeOffsetvalue that specifies the absolute expiry time of an item. This item is set to expire at 8:15 am on June 14th 2017 UTC:
<cache expires-on="new DateTimeOffset(new DateTime(2017, 6, 14, 8, 15, 0))">@DateTime.Now</cache>
An item can be set to expire after a specified period of inactivity. This is known as "sliding expiration". The
expires-slidingattribute takes a
TimeSpanvalue. In this example, the item is set to expire 20 minutes after the last time the page was requested:
As each request is made for the cached item, the expiration time is reset to 20 minutes after the request.
Items in the cache can have a priority applied to them, determining how they are dealt with when memory pressure results in items being cleared from the cache before their pre-ordained expiry time. The
priorityattribute takes a
CacheItemPriorityenum value that specifies the relative priority of items in the cache. The available values are
Highpriority will be the last to be removed. Items set as
NeverRemovewill remain in the cache. You should exercise caution when applying
NeverRemoveas there is a danger of overflowing the cache with more data than it can handle. This is how to set an item with
You can cache multiple versions of the same content based on different criteria. The
vary-byattribute provides a mechanism for you to specify the criteria to be used to determine whether to store another version of existing cached content.
The attribute has a number of preset options:
The values of cookies can be taken into consideration when caching different versions of content. The
vary-by-cookieoption takes a comma-separated string representing the names of the cookies:
<cache vary-by-cookie="AppCookie1, AppCookie2">@DateTime.Now</cache>
You can store multiple versions of content based on differing request header values. Multiple headers can be applied as a comma-separated string. This example stores different versions of the cached content based on the user's preferred language:
vary-by-queryoption enables the use of query string parameters as the criteria for caching different versions. Query string parameter names are supplied in a comma-separated list:
You can have route data parameters taken into account by using the
vary-by-routeoption. This attribute also accepts a comma-separated string of route parameter names as a value:
<cache vary-by-route="key1, key2">@DateTime.Now</cache>
The final built-in option enables you to specify that each user gets their own version of cached content. The
vary-by-userattribute requires a
bool, which should be set to
Finally, you can provide an arbitrary string value as a parameter if you want to use a value that isn't exposed by one of the preset options:
You can use any combination of the
vary-byattributes that you need.