You have pages in your application that you want to cache but ASP.NET does not provide built-in support for the dependencies you need, such as browser type and full version number.
Add the @ OutputCache
directive at the top of the
.aspx
file of each page you want to cache. Set
the VaryByCustom
attribute to the name of a custom
string, such as "BrowserFullVersion
“, as shown in
the following code snippet:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="CH13CacheByCustomStringVB.aspx.vb" Inherits="ASPNetCookbook.VBExamples.CH13CacheByCustomStringVB" %><%@ OutputCache Duration="10" VaryByParam="none"
VaryByCustom="BrowserFullVersion" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> ... </html>
Next, override the GetVaryByCustomString
method in
Global.aspx.vb
(Global.aspx.cs
in C#) and write code that
builds a unique string for the value you have assigned to the
VaryByCustom
attribute. Example 13-1 and Example 13-2 show VB and
C# class files for overriding this method to return a full browser
version number.
ASP.NET provides the ability to control the caching of pages as a function of custom strings that you provide, which gives you the ability to control the caching by variations not directly supported by ASP.NET. In the example we use to illustrate this solution, we show how to cache pages based on the browser type, its major version number (integer portion of version number), and its minor version number (the decimal portion of the version number).
The first step in this recipe is to add the @OutputCache
directive shown earlier to the
.aspx
file of the page you plan to cache. Set
the VaryByCustom
attribute to the name of the
string that is to be used to determine caching. In our example we
have named the string "BrowserFullVersion
“.
Next, you need to override the
GetVaryByCustomString
method in
global.asax.vb
(or
global.asax.cs
for C#) to return the full
browser version when the passed parameter (arg
) is
set to "BrowserFullVersion
“. This provides a
unique string for each browser and version to allow ASP.NET to
differentiate between the browsers and use the cached version of the
page accordingly.
This technique is not limited to caching by browser version. You can
use almost any information to uniquely identify pages that should be
cached separately. For example, you could use a value stored in a
cookie to determine the uniqueness of a page. The cookie collection
is accessed through the Request
object in the same
manner as the Browser
data
(context.Request.Cookies
).
One thing you cannot use is Session
information.
The reason for this is that at the time
GetVaryByCustomString
is called, session
information has not been retrieved from session storage. The session
ID is available but not the session data. If you need to use a value
related to a specific session, the data must first be stored in a
cookie and used as described earlier.
Unlike other attributes in the @
OutputCache
directive, the
VaryByCustom
attribute can contain only one value.
It cannot be set to a semicolon-delimited string, because the entire
unparsed value is passed to the
GetVaryByCustomString
method. Your code in the
GetVaryByCustomString
will have to perform the
parsing if you want to use multiple values for a single page.
Example 13-1. GetVaryByCustomString method (.vb)
'************************************************************************* ' ' ROUTINE: GetVaryByCustomString ' ' DESCRIPTION: This routine provides the ability to set custom string ' values to control the page or page fragment caching ' based on values assigned to the VaryByCustom attribute ' of the OutputCache directive. '------------------------------------------------------------------------- Public Overrides Function GetVaryByCustomString( _ ByVal context As System.Web.HttpContext, _ ByVal arg As String) As String Dim value As String = Nothing 'if argument is requesting the full browser version, build a string 'containing the browser name, major version, and minor versionIf (arg = "BrowserFullVersion") Then
value = "BrowserFullVersion =" & _
context.Request.Browser.Browser & _
context.Request.Browser.MajorVersion.ToString( ) & "." & _
context.Request.Browser.MinorVersion.ToString( )
End If
Return (value) End Function 'GetVaryByCustomString
Example 13-2. GetVaryByCustomString method (.cs)
//************************************************************************ // // ROUTINE: GetVaryByCustomString // // DESCRIPTION: This routine provides the ability to set custom string // values to control the page or page fragment caching // based on values assigned to the VaryByCustom attribute // of the OutputCache directive. //------------------------------------------------------------------------ public override string GetVaryByCustomString(System.Web.HttpContext context, string arg) { String value = null; // if argument is requesting the full browser version, build a string // containing the browser name, major version, and minor versionif (arg == "BrowserFullVersion")
{
value = "BrowserFullVersion =" +
context.Request.Browser.Browser +
context.Request.Browser.MajorVersion.ToString( ) + "." +
context.Request.Browser.MinorVersion.ToString( );
}
return(value); } // GetVaryByCustomString