在本文中构建自定义的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 在应用程序的整个生存期内仅保留提供程序的一个实例,因此,我们可以在构造函数中进行一些设置,如下所示:

待续..

 

 

 

相关文章:

  • 2022-01-03
  • 2021-12-29
  • 2021-06-02
  • 2022-12-23
  • 2021-07-26
  • 2021-06-03
  • 2022-02-10
猜你喜欢
  • 2021-07-11
  • 2022-01-04
  • 2021-10-07
  • 2022-12-23
  • 2021-12-05
  • 2022-02-13
  • 2023-03-13
相关资源
相似解决方案