如何:使用 VaryByCustom 事件处理程序扩展缓存

上次修改时间: 2011年5月26日

适用范围: SharePoint Server 2010

可以通过创建 IVaryByCustomHandler 接口来扩展和处理缓存。VaryByCustom 是一项 ASP.NET 缓存功能,您可以使用此功能根据自定义字符串缓存页面输出的多个版本。例如,如果您希望显示对每个用户显示不同欢迎字符串的缓存页面,则可以使用 VaryByCustom。有关 ASP.NET 中 VaryByCustom 的详细信息,请参阅 MSDN 上的文章页面输出缓存,第 1 部分

本主题包括在 Microsoft SharePoint Server 2010 中使用 VaryByCustom 属性来扩展缓存所必需的三个基本步骤。

  • 创建一个 VaryByCustom 处理程序,此处理程序提供输出缓存用来在返回的页面上改变内容的自定义字符串的列表。

  • 在 Global.asax 文件中注册处理程序。

  • 在 Web 应用程序中定义要针对每个缓存配置文件进行改变的自定义字符串。系统将这些字符串传递给 VaryByCustom 处理程序,此处理程序确定如何改变缓存。

示例代码根据两个参数改变内容:客户端浏览器是否支持级联样式表 (CSS),以及当前用户是否为管理员。根据传递给 GetVaryByCustomString 方法的自定义字符串的值,此函数将构造一个字符串,此字符串基于其中一个参数、这两个参数或不基于这两个参数。缓存系统为 GetVaryByCustomString 返回的每个值创建一个单独的缓存。例如,如果 custom 的值为 SupportsCSS,GetVaryByCustomString 将返回一个包含 True 或 False 的字符串,具体取决于 sb.Append(context,Request.Browser.SupportsCss.ToString) 的结果:一个结果支持 CSS,而另一个不支持。

可以在 Web 应用程序中为每个缓存配置文件指定自定义字符串的值,如下面的代码示例所示:

//First, write a VaryByCustom handler. This example varies based on
//two parameters: whether the client browser supports CSS,
//and whether the current user is an administrator.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint.Publishing;
using Microsoft.SharePoint.ApplicationRuntime;
using Microsoft.SharePoint;

namespace CacheDemo
{
    public class CacheDemoHttpApplication ; SPHttpApplication, IVaryByCustomHandler
    {
        internal const string MyVaryByString1 = "SupportsCSS";
        internal const string MyVaryByString2 = "SiteAdmin";
        public override void Init()
        {
            base.Init();
            this.RegisterGetVaryByCustomStringHandler((Microsoft.SharePoint.ApplicationRuntime.IVaryByCustomHandler)this);
        }

        public string GetVaryByCustomString(HttpApplication app, HttpContext context, string custom)
        {
            //The code looks for parameters specified in the cache 
            //profile that are passed to the handler and parses them, 
            //delimited by a semicolon.
            StringBuilder sb = new StringBuilder();
            string[] strings = custom.Split(';');
            bool appended = false;
            foreach (string str in strings)
            {
                switch (str)
                {
                    case MyVaryByString1:
                        if (appended)
                        {
                            sb.Append(';');
                        }
                        //If you want to vary based on a property of
                        //the request, work with the http context.
                    sb.Append(context.Request.Browser.SupportsCss);
                        break;
                    case MyVaryByString2:
                        if (appended)
                        {
                            sb.Append(';');
                        }
                        //If you want to vary by whether the current
                        //user is the site administrator,
                        //examine the SPContext.
                        sb.Append(SPContext.Current.Web.UserIsSiteAdmin.ToString());
                        break;

                    default:
                        continue;
                }
                appended = true;
            }
            return sb.ToString();
        }
    }
}

接下来,在 Global.asax 文件中注册 VaryByCustom 事件处理程序。您必须修改程序集标记来指定您使用前面的代码构建的程序集。

//Register the VaryByCustom string in the Global.asax file.
<%@ Assembly Name="Microsoft.SharePoint"%>
<%@ Assembly Name="cachedemo"%>
<%@ Import Namespace="cachedemo" %>
<%@ Application Language="C#" Inherits="cachedemo.CacheDemoHttpApplication" %>

最后,在 Web 应用程序中为每个缓存配置文件指定自定义字符串值。

编辑网站集中的每个缓存配置文件

  1. 导航到网站集的根网站。

  2. 单击"网站操作",指向"网站设置",然后单击"修改所有网站设置"。

  3. 单击"网站集管理"部分的"网站集缓存配置文件"。

  4. 指向您要修改的缓存配置文件,右键单击此文件,然后单击"编辑"。

  5. 在"随自定义参数变化"字段中键入要添加的自定义字符串。对于该示例,键入 SupportsCSS;SiteAdmin,然后单击"确定"。

请参阅

概念

输出缓存和缓存配置文件

自定义缓存概述

对象缓存