在本文中构建自定义的outputcache提供程序需要实现OutputCacheProvider这个抽象类。我的开发环境(vs2010+mvc3+sql2008)
现在,借助新的 OutputCacheProvider 类型,您可以在 ASP.NET 中实现您自己的缓存页面输出机制。
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。
过期日期由 Duration 属性确定,关键字则由到页面的路径和必要的 VaryBy 值的组合确定 — 例如,如果提供了 VaryByParam 属性,则会查询字符串或参数值。这里就不一一说明。
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); }
使用 MongoDB 构建自定义的 OutputCacheProvider
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 定义为内部类,如下所示:
[Serializable] internal class CacheItem { public string Id { get; set; } public byte[] Item { get; set; } public DateTime Expiration { get; set; } }
Expiration 字段对应于 Duration 参数,而 Item 属性是要缓存的项目。
由于我们知道 ASP.NET 在应用程序的整个生存期内仅保留提供程序的一个实例,因此,我们可以在构造函数中进行一些设置,如下所示:
待续..