实现MonoRail页面缓存

本文探讨了Monorail Web框架的性能特点及其在页面级缓存方面的实现方式。Monorail相较于WebForm慢约5%,主要性能损耗源于反射机制及Velocity模板的解释执行。文章详细介绍了如何通过自定义Attribute和Facility来实现Monorail的页面缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

monorail是一个mvc模式的web框架, 它完全抛弃了传统的webform. 很多朋友都担心monorail会存在性能问题. 一个原因是它大量使用反射, 一个是它的velocity页面模板是解释执行(monorail有编译执行的brail模板引擎, 但是通常由于学习成本及它未及velocity成熟的因没有被采用). 当然webform复杂的生命周期, 控件结构及viewstate机制也是性能的瓶颈. 经过简单的测试, 总体来说monorail会比webform慢5%左右.

我感觉 到更大的问题是monorail的官方并不支持页面级缓存. 页面缓存对互联网应用来说是很重要的, 因为网站读操作的频率要远远大于写, 而且还会不幸碰上无耻的爬虫和发广告软件的攻击. 我反编译了跟缓存相关的.net framework代码后, 发现它和webform完全无关, 管理页面缓存的System.Web.Caching.OutputCacheModule在 HttpApplication的ResolveRequestCache事件中寻找是否有可用的缓存, 在UpdateRequestCache事件中检查当前HttpResponse的CachePolicy, 决定是否要把Response的内容缓存起来. 所以任何形式的asp.net应用程序都可以使用它, 只需要设置好当前的HttpResponse的CachePolicy. 在webform里页面缓存是作为预编译指令标记在aspx里, 在monorail中, 典型的的做法就是为controller编写一个facility, 然后通过自定义的Attribute去指定缓存相关的属性.

这个facility很简单: 定义一个的Attribute用来标记在controller和action上, 属性照搬@outputcache指令的参数Duration, Location, VaryByParam, VaryByHeader, VaryByCustom, 注册自己的contributor, inspector, 在inspector里根据Attribute的属性去设置HttpContext.Current.Response.Cache, 就这样ok了...

[PageCache]
public class HomeController : SmartDispatcherController
{
    [PageCache(Duration
= 30, VaryByParam = "*")]
    
public virtual void Index()
    {
    }
}

转载于:https://www.cnblogs.com/EricGu/archive/2007/12/22/1010357.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值