VS 2010 和 .NET 4.0 系列之《ASP.NET 4中的可扩展输出缓存》篇

【原文地址】Extensible Output Caching with ASP.NET 4 (VS 2010 and .NET 4.0 Series)

【原文发表日期】 Wednesday, January 27, 2010 11:27 PM

 

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的VS 2010 和 .NET 4所撰写的贴子系列的第十四篇。今天的博客讨论ASP.NET 4中做的一些输出缓存扩展性方面的改进。这些改进可为所有的ASP.NET 4应用所用,包括那些用ASP.NET Web Forms和ASP.NET MVC建造的应用。

今天的输出缓存(Output Caching)

ASP.NET 1.0引进了输出缓存的概念,允许开发人员将网页,控件,控制器,和HTTP回复生成的输出捕捉和保存在内存的缓存中。然后在之后的web请求中,ASP.NET可以通过从缓存中取出和使用现成的输出(而不是再次执行网页/控制器重新从头生成输出),快速地将内容传出。这可以显著地提高你应用的性能,特别是在你的内容是基于数据库中的数据的情形下(因为当内容是输出缓存的,结果是你在后来的请求中不必再访问数据库)。

ASP.NET的输出缓存系统是足够灵活的,允许你根据网页/控制器的查询字符串/表单提交参数来缓存不同版本的内容(例如:Browse.aspx?category=Beverages 比之与 Browse.aspx?category=Meat)。它也允许你基于访问你的应用的客户端的浏览器类型或者用户语言选项来缓存不同版本的内容。这允许你在缓存为桌面浏览器优化的内容版本之外,再缓存一个可移动设备的版本,以及根据用户是想阅读英文还是法文的网页更改缓存的条目。你可以配置ASP.NET在一个特定的时间内(例如,一分钟,之后的下一个请求会重新生成内容并且再次缓存)缓存某个特定的输出缓存,你还可以配置ASP.NET基于某个外部事件(例如,缓存内容基于的数据库改变了)动态地使得缓存条目失效。

但ASP.NET V1->V3.5中的输出缓存有一个限制,就是缓存存储本身不是可扩展的,- 缓存的内容总是保存在内存中的。

ASP.NET 4的输出缓存扩展性

ASP.NET 4对输出缓存添加了扩展点,现在允许开发人员配置一个或多个定制的输出缓存提供器(output-cache provider)。输出缓存提供器可以使用任何存储机制来持久化缓存内容。这使得轻松地创建使用任何持久化机制来保存缓存内容的输出缓存提供器成为可能, 这些持久化机制包括本地或远程硬盘,数据库,云存储,和分布式缓存引擎(象memcached 或 velocity)。

你可以通过创建一个ASP.NET 4中的新System.Web.Caching.OutputCacheProvider类的继承类来创建定制的输出缓存提供器。然后在你的继承类中,你可以覆盖4个公开方法,提供添加/删除/获取/更新缓存内容的实现(会传入一个独特的键,用于识别每个单独的缓存条目)。然后,你可以通过在应用的web.config文件中使用<outputCache>元素的新<providers>节将其注册,配置ASP.NET 4来使用你定制的输出缓存提供器:

在上面,我加了一个新的输出缓存提供器(我将其命名为“SampleCache”),是用OutputCacheSample.dll程序集中的“ScottOutputCache”类实现的。我还配置ASP.NET,将我的“SampleCache”实现作为默认的输出缓存实现来使用(每当内容需要输出缓存时),- 这是通过设置<outputCache>元素的 “defaultProvider”属性实现的。

至此,当我在任意一个.aspx网页的顶部加一个OutputCache指令时,内容就会通过使用我的ScottOutputCache提供器被缓存和保存起来:

<%@ OutputCacheDuration="60" VaryByParam="None"  %>

同样地,如果我将[OutputCache]特性加到某个ASP.NET MVC控制器的任意一个action方法上时,内容也会通过使用我的ScottOutputCache提供器被缓存和保存起来:

定制所用的输出缓存提供器

在上面,我配置ASP.NET总是默认使用我的“SampleCache”提供器来缓存内容,每当输出缓存在应用中使用的话。

作为一个稍微更高级的选项,开发人员还可以配置ASP.NET在每个请求的基础上动态地选择某个输出缓存提供器。这对你想要稍微更丰富一点缓存语义的场景是非常有用的。例如,你也许想要使用内置的ASP.NET内存提供器来缓存网站的“首页(Home)”或者“前十个请求最多的网页”(因为内容在内存中,所以速度是超级地快),然后将访问数不多的网页缓存到硬盘上。

你可以通过覆盖应用的Global.asax文件中的 GetOutputCacheProviderName() 方法,在每个请求的基础上,动态指定使用哪个输出缓存提供器。在下面,我表明,对我应用中的 “Home.aspx”网页我想要使用内置的,用内存的ASP.NET输出缓存提供器,然后对所有其他的请求,我想要使用注册在web.config文件中的提供器:

这个根据场景轻松地转换提供器的能力,最终将促成一堆非常强有力的场景。

常用的输出缓存提供器

我们将发布例程,示范如何实现将缓存内容保存在文件系统中的基于硬盘的输出缓存提供器。我们还将发布例程,示范如何将输出缓存与新的 Windows Server AppFabric Caching Service (以前叫“Velocity”)相集成。AppFabric的缓存服务将是免费的,完全支持的微软分布式缓存系统。将新的 ASP.NET 4 输出缓存扩展性与memcached(很流行的开源分布式缓存系统)相集成也会是非常容易的。

你可以观看Stefan Schackow在PDC 2009上的ASP.NET 4核心运行时讲座来了解如何创建缓存提供器的细节,你还可以从这个PDC 2009讲座中了解AppFabric的缓存服务的细节。

结语

ASP.NET 4中新加的输出缓存提供器扩展性将允许开发人员轻易地追求网站和应用更勇猛的,也更聪明的输出缓存策略。这将显著地提高应用的性能和响应性,改进终端用户的体验,以及减少所需服务器的资源量。

希望本文对你有所帮助,

Scott


上一篇博客:关于技术争论(尤其是ASP.NET Web Forms 和 ASP.NET MVC 之争)