MonoRail学习笔记八:页面缓存的使用
2007-10-24 11:21
591 查看
以前版本中MonoRail是不支持页面缓存的,在1.0 RC3版中加入了页面缓存的支持,有了页面缓存之后会对性能有很大的提升。
主要是通过加入了一个新的属性CacheAttribute.cs,其实后台也是同样使用了System.Web下的缓存处理的机制
(以前Yok也写过一篇实现MonoRail页面缓存,他是通过编写自己的缓存类来实现的,效果也不错)
使用方法很简单,如下所示:
下面列出了主要的文件,要使用缓存只是在Controller下红色的一条语句
<html>
<head>
<title>测试页面</title>
</head>
<body>
<form action="/index.rails" method="post" >
ID:<input type="text" name="id" value="1"/><br />
姓名:<input type="text" name="name" value="姓名"/><br />
年龄:<input type="text" name="age" value="22"/><br />
生日:<input type="text" name="birthday" value="2007-1-1"/><br />
<input id="Submit1" type="submit" value="submit" />
</form>
</body>
</html>
Controller文件的Index方法:
[Cache(HttpCacheability.Public, Duration = 360, VaryByParams = "id,name")]
public void Index(int id, string name, int age, DateTime birthday)
<html>
<head>
<title>测试结果</title>
</head>
<body>
<form>
ID:$id<br />
姓名:$name<br />
年龄:$age<br />
生日:$birthday<br />
</form>
</body>
</html>
测试结果(在Index方法上设置断点):
第一次调用:进入断点,正常显示测试结果
第二次调用:(页面输入值不变),不进入断点,正常显示测试结果
第三次调用:(页面中年龄输入值改变),不进入断点,显示结果中年龄值还是之前的值
第四次调用:(页面中姓名输入值改变),进入断点,正常显示测试结果
第五次调用:(6分钟之后)),进入断点,正常显示测试结果
通过以上测试证明:MonoRail中的页面缓存是可以正常使用的,可以有效提高性能
实现机制简单分析:
在每个action执行之后,判断是否有Cache属性,如果有,就调用如下方法:
void ICachePolicyConfigurer.Configure(HttpCachePolicy policy)
{
policy.SetCacheability(cacheability);
policy.SetSlidingExpiration(slidingExpiration);
policy.SetValidUntilExpires(validUntilExpires);
policy.SetAllowResponseInBrowserHistory(allowInHistory);
if (duration != 0)
{
policy.SetExpires(DateTime.Now.AddSeconds(duration));
}
if (varyByCustom != null)
{
policy.SetVaryByCustom(varyByCustom);
}
if (varyByHeaders != null)
{
foreach(String header in varyByHeaders.Split(','))
{
policy.VaryByHeaders[header.Trim()] = true;
}
}
if (varyByParams != null)
{
foreach(String param in varyByParams.Split(','))
{
policy.VaryByParams[param.Trim()] = true;
}
}
if (etag != null)
{
policy.SetETag(etag);
}
}
好像也蛮简单的-_-,直接根据参数调用HttpCachePolicy类中的相应方法就可以了
主要是通过加入了一个新的属性CacheAttribute.cs,其实后台也是同样使用了System.Web下的缓存处理的机制
(以前Yok也写过一篇实现MonoRail页面缓存,他是通过编写自己的缓存类来实现的,效果也不错)
使用方法很简单,如下所示:
下面列出了主要的文件,要使用缓存只是在Controller下红色的一条语句
<html>
<head>
<title>测试页面</title>
</head>
<body>
<form action="/index.rails" method="post" >
ID:<input type="text" name="id" value="1"/><br />
姓名:<input type="text" name="name" value="姓名"/><br />
年龄:<input type="text" name="age" value="22"/><br />
生日:<input type="text" name="birthday" value="2007-1-1"/><br />
<input id="Submit1" type="submit" value="submit" />
</form>
</body>
</html>
Controller文件的Index方法:
[Cache(HttpCacheability.Public, Duration = 360, VaryByParams = "id,name")]
public void Index(int id, string name, int age, DateTime birthday)
<html>
<head>
<title>测试结果</title>
</head>
<body>
<form>
ID:$id<br />
姓名:$name<br />
年龄:$age<br />
生日:$birthday<br />
</form>
</body>
</html>
测试结果(在Index方法上设置断点):
第一次调用:进入断点,正常显示测试结果
第二次调用:(页面输入值不变),不进入断点,正常显示测试结果
第三次调用:(页面中年龄输入值改变),不进入断点,显示结果中年龄值还是之前的值
第四次调用:(页面中姓名输入值改变),进入断点,正常显示测试结果
第五次调用:(6分钟之后)),进入断点,正常显示测试结果
通过以上测试证明:MonoRail中的页面缓存是可以正常使用的,可以有效提高性能
实现机制简单分析:
在每个action执行之后,判断是否有Cache属性,如果有,就调用如下方法:
void ICachePolicyConfigurer.Configure(HttpCachePolicy policy)
{
policy.SetCacheability(cacheability);
policy.SetSlidingExpiration(slidingExpiration);
policy.SetValidUntilExpires(validUntilExpires);
policy.SetAllowResponseInBrowserHistory(allowInHistory);
if (duration != 0)
{
policy.SetExpires(DateTime.Now.AddSeconds(duration));
}
if (varyByCustom != null)
{
policy.SetVaryByCustom(varyByCustom);
}
if (varyByHeaders != null)
{
foreach(String header in varyByHeaders.Split(','))
{
policy.VaryByHeaders[header.Trim()] = true;
}
}
if (varyByParams != null)
{
foreach(String param in varyByParams.Split(','))
{
policy.VaryByParams[param.Trim()] = true;
}
}
if (etag != null)
{
policy.SetETag(etag);
}
}
好像也蛮简单的-_-,直接根据参数调用HttpCachePolicy类中的相应方法就可以了
相关文章推荐
- MonoRail学习笔记八:页面缓存的使用
- PHP页面静态化学习笔记之三:使用PHP缓存机制完成静态化
- Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存
- MonoRail学习笔记三:使用方便功能强大的routing功能
- Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存
- php学习笔记(三十九)smarty缓存特性的使用(包括局部缓存)
- MonoRail学习笔记六:Filter功能使用
- MonoRail学习笔记十一:页面控件的填充和验证
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
- php学习笔记(二十一)使用GET方法将值从一个页面传递到另一个页面
- MonoRail学习笔记十二:layout布局的使用
- MonoRail学习笔记三:使用方便功能强大的routing功能
- Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)
- 【python学习笔记】3:LRU(最近最少使用页面置换)算法
- MonoRail学习笔记六:Filter功能使用
- MonoRail学习笔记十二:layout布局的使用
- MonoRail学习笔记二十:资源文件的使用和多语言支持
- MonoRail学习笔记六:Filter功能使用
- MonoRail学习笔记十二:layout布局的使用
- MonoRail学习笔记二十:资源文件的使用和多语言支持