在本文中构建自定义的outputcache提供程序需要实现OutputCacheProvider这个抽象类。我的开发环境(vs2010+mvc3+sql2008)
ASP.NET 输出缓存使用的是内存存储机制,并且在 NET Framework 4 出现之前,您无法使用您自己的实现覆盖或替代默认缓存。 现在,借助新的 OutputCacheProvider 类型,您可以在 ASP.NET 中实现您自己的缓存页面输出机制。
在 ASP.NET Web 窗体应用程序中,可以通过向任意 ASP.NET 页面或用户控件添加 OutputCache Page 指令来配置输出缓存:
1 <%@ OutputCache Duration="60" Location="Any" VaryByParam="name" %>
对于 ASP.NET MVC 应用程序,输出缓存是使用 ASP.NET MVC 附带的操作筛选器来提供的,该操作筛选器可用作任何控制器操作的一个属性:
[OutputCache(Location = OutputCacheLocation.Server, Duration = 3600, VaryByParam = "none")] public ActionResult Index() { return View(); }
关于outputcache各个指令参数 可以参考这位网友的文章http://www.cnblogs.com/xzf158/archive/2009/01/07/1371179.html。
对于传统的输出缓存,在您的应用程序中实现该功能时不需要任何其他东西。 OutputCache 类型是一个在您的应用程序启动时运行,并在遇到页面指令或操作筛选器时开始发挥作用的 HttpModule。 收到第一个相关的页面或控制器请求后,ASP.NET 将接收生成的内容(HTML、CSS、JavaScript 文件等)并将各个项目以及过期日期和用于标识相应项目的关键字放入内存缓存中。 过期日期由 Duration 属性确定,关键字则由到页面的路径和必要的 VaryBy 值的组合确定 — 例如,如果提供了 VaryByParam 属性,则会查询字符串或参数值。这里就不一一说明。
NET Framework 4 引入了一种新功能,该功能使开发人员能够创建他们自己的输出缓存提供程序,并且只需对新的或现有的应用程序及其配置作少量更改,便可轻松地将这些提供程序插入其中。 无论他们选择的缓存信息使用的是哪种存储机制(例如,本地磁盘、相关和非相关数据库、云,甚至是分布式缓存引擎(如 mamecached )),都可以随意使用这些提供程序。 甚至还可以针对相同应用程序中的不同页面使用多个提供程序。
与创建派生自新的 System.Web.Caching.OutputCacheProvider 抽象类的新类以及覆盖 ASP.NET 使用缓存项目所需的四种方法一样,创建您自己的输出缓存提供程序也很简单。 下面列出了 OutputCacheProvider 类的框架定义.
public abstract class OutputCacheProvider : ProviderBase { public abstract object Get(string key); public abstract object Add(string key, object entry, DateTime utcExpiry); public abstract void Set(string key, object entry, DateTime utcExpiry); public abstract void Remove(string key); }
实现了这四种方法后,接下来要做的就是向您的 web.config 添加新提供程序,将其指定为默认提供程序,并向您的应用程序添加一个 OutputCache 指令或属性。 这里我介绍一下如何创建我们自己的输出缓存提供程序(使用一个叫做 MongoDB 的文档数据库)时详细说明这些步骤、后面也会提到用分布式缓存(memacached)的提供程序,当然也可以扩展文件缓存,这里就不提了。
MongoDB我没有在实际项目中使用,所以在学习自定义outputcache时,顺便看了下MongoDB的API,有兴趣的可以自己去了解看看,这里就不介绍了http://www.baidu.com/s?ie=utf-8&bs=mongodb+site%3Acnblogs.com&f=8&rsv_bp=1&rsv_spt=3&wd=mongodb+site%3Acnblogs.com&inputT=0
Mongodb的驱动程序有两个版本。关于这个驱动程序的使用 给一个连接http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.htm
文章写的很详细。准备工作就绪,现在看如何实现自定义的outputcache,我创建了一个CacheProvider的类库,一个类文件为MongoDBProperties ,一个为CacheItem,还有一个是memceched的类,打算尝试一个nosql的缓存和一个分布式缓存。先看看mongodb的实现。
class MongoDBProperties : System.Web.Caching.OutputCacheProvider, IDisposable { readonly Mongo _mongo; readonly IMongoCollection<CacheItem> _cacheItems; string _connecstring = "server=192.168.1.254"; public MongoDBProperties() { _mongo = new Mongo(_connecstring); _mongo.Connect(); var store = _mongo.GetDatabase("OutputCacheDB"); _cacheItems = store.GetCollection<CacheItem>(); } public void Dispose() { _mongo.Disconnect(); _mongo.Dispose(); } }
这个类继承了抽象类outputcacheproper,那么需要实现几个方法
public override object Get(string key) { return null; } public override object Add(string key, object entry, DateTime utcExpiry) { return null; } public override void Set(string key, object entry, DateTime utcExpiry) { return; } public override void Remove(string key) { return; }
注意上面定义的那个CacheItem类。CacheItem 的作用是包含我的输出缓存提供程序与 ASP.NET 和我的数据库协同工作所需的相关详细信息,不过它不是我的提供程序所需的外部对象。 因此,我将 CacheItem 定义为内部类,如下所示:
[Serializable] internal class CacheItem { public string Id { get; set; } public byte[] Item { get; set; } public DateTime Expiration { get; set; } }
Id 映射到 ASP.NET 向我提供的关键字。 您会想到这个关键字是路径和在您的页面指令或操作属性中定义的任何 VaryBy 条件的组合。 Expiration 字段对应于 Duration 参数,而 Item 属性是要缓存的项目。
我们将通过在 DocumentDatabaseOutputCacheProvider 类的构造函数中进行一些设置来开始实现我们的提供程序。 由于我们知道 ASP.NET 在应用程序的整个生存期内仅保留提供程序的一个实例,因此,我们可以在构造函数中进行一些设置,如下所示:
待续..