通过这篇文章你将学习到在MVC中如何使用输出缓存,业务逻辑我就不多介绍了,主要是Outputcache的基本使用。至于数据缓存还是等我的下一篇文章吧,一步一步来不急的。
 
输出缓存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我这里以Action为示例
[OutputCache(Duration =)]//设置过期时间为20秒
public ActionResult ExampleCache()
{
var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
ViewBag.timeStr = timeStr;
return View();
}

我们在页面上可以很明显地看到:

在20秒时间差距内页面上的时间都不会被改变。他在Response Header中过期时间和上次修改的时间正好相隔20秒。Http StatusCode 304 这个我得简单介绍下,这个页面是缓存在客户端浏览器的,服务器在接收响应时(还没有超过20秒)并没有返回给浏览器一个新的html文档,只是告诉浏览器 No Modified,从本地去读取即可。当然有必要去了解一下304 ,介绍看看这篇文章http状态码304的介绍
在Controller上加OutputCache特性时,Controller下的所有的Action都将实现此特性。如果同时Action也有此特性时,以Action为标准,Action的粒度更精细。
 
Outputcache特性中可以加上一些参数,主要有这些

Outputcache重要的参数
int Durrtion 获取或设置缓存持续时间(以秒为单位)
bool NoStore 是否存储缓存,默认是false,当为true时http状态码就会变成200
string VaryByParam  获取或设置参数变化的值。不同的参数都会被缓存不同的文档,多个参数用逗号隔开,none、*(空、所有)
string CacheProfile 获取或设置缓存配置文件名称,也就是说在配置文件中设置缓存
string VaryByCustom 获取或设置基于自定义项变化的值,自定义任何输出缓存的文字,比较常用
 Location 枚举值 None不缓存,Server缓存在服务器端,Client缓存在浏览器,Any在浏览器、代理服务器、web服务器
string sqlDependency 获取或设置 SQL 依赖项,根据数据库的变化更新缓存
   
对于这些参数如何使用我就写几个例子,看看效果吧。

1.输出缓存CacheProfile使用配置文件设置缓存

这种方式便于统一配置,当然也可以设置参数duration、location 、varybyparam等。我们需要在system.web 节点下加入这些
<!---CacheProfile配置文件中设置缓存-->
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<!---CacheProfile配置文件中设置缓存end-->

其实作用和效果还是一样,无非就是方便点,统一的配置参数都直接写webconfig文件里面。当然你也可以在Controller中写。看效果吧

2.输出缓存VarByParam参数的使用

简单点来说就是根据不同的参数值生成缓存。代码是这样的
[OutputCache(Duration =,VaryByParam ="type,page")]
public ActionResult ExampleVaryByParam(string type,int page)
{
ViewBag.type = type;
ViewBag.page= page;
return View();
}

通过页面上可以观察到,这是不符合缓存数据的更新的,在缓存持续的时间内,改变了参数值,但是Action并没有重新生成页面返回,但是浏览器的Http Status Code

还是200 ,所以只用VarByParam参数这种缓存是没有做到缓存数据的更新,这我就纳闷了。知道的可以告诉我一下。
但是如果只是设置一个参数的,当参数值发生变化时,缓存也发生变化。设置多个参数时直接用*表示,也是有缓存数据的更新的。

3.输出缓存VarByCustom参数的使用

输出缓存中VarBuCustome参数的主要作用是根据数据改变让客户端缓存过期并及时更新。

主要用于自定义输出缓存要求的任意文本。如果赋值该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义的字符串,则必须在应用程序的Global.asax文件中重写 Httpapplication GetVaryByCustomString方法。

public override string GetVaryByCustomString(HttpContext context, string custom)
{
//custom 是Outputcache中的参数VaryByCustom参数值 ,VaryByCustome为*代指所有参数
if (custom == "type")
{
return context.Request.AnonymousID; //返回的这个字符串会与当前Action的缓存比较,字符串不一致则更新缓存。
}
return base.GetVaryByCustomString(context, custom);
}
特性
[OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)]
public ActionResult ExampleVaryByCustom(string type)
{
ViewBag.type = type;
return View();
}

通过观察实现的效果很明显:在缓存持续的时间内,type参数值没有改变时 status Code 还是304 ,参数值发生改变时则是200重新生成页面了。

从这个即时更新的缓存来说已经达到要求了,当然这从业务上来说还是不够的。
可以得出的缓存结果,整个更新缓存的机制是 发现参数值不同便重新生成视图,就可以做到缓存的更新(当然更深入的缓存机制我也不知道,欢迎批评)
 

4.输出缓存SqlDependency的使用

首先我们还是来学习一下如何启用数据库缓存依赖项。

运行cmd命令: cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

运行相关命令: aspnet_regsql -S .  -U sa -P 123456  -ed -d 数据库名 -et -t 表名

解释一下

注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 表名
删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 表名
取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名数据库名
列出已注册表:aspnet_regsql -S . -E -d 数据库名 -lt

如图:

现在我们已经开启数据库的缓存依赖,我们继续在webconfig这样配置。

<!---CacheProfile配置文件中设置缓存-->
<caching>
<!--缓存的数据库依赖-->
<sqlCacheDependency>
<databases>
<add name="CacheDependencyProduct" connectionStringName="Conn" pollTime=""/>
<!--name:配置sqlDependency会用到,connectionStringName:数据库连接字符串的名称,pollTime:监听数据库变化的间隔时间,以毫秒为单位。即每隔1秒钟去监听数据库中的表Product是否有变化-->
</databases>
</sqlCacheDependency>
<outputCacheSettings>
<outputCacheProfiles>
<!--<add name="exampleCacheProfile" duration="" location="Any" enabled="true"/>-->
<add name="exampleSqlDependency" duration="" location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/>
<!--sqlDenpendency:数据依赖节点名称+冒号+数据库表名(区分大小写)-->
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<!---CacheProfile配置文件中设置缓存end-->

当然还有数据库连接字符串,还是贴出来吧

<code class="language-html">  <connectionStrings>
<!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-webapiToken-20170209085002.mdf;Initial Catalog=aspnet-webapiToken-20170209085002;Integrated Security=True" providerName="System.Data.SqlClient" />-->
<add name="Conn" connectionString="server=.;database=Monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/>
</connectionStrings>

为了看到效果可以在在视图中加个时间

[OutputCache(CacheProfile = "exampleSqlDependency")]
public ActionResult ExampleSqlDependency()
{
ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
return View(); }

所实现的效果是:数据库的Product表数据没有任何变化时,20秒的缓存持续时间内,这个时间是不会变化的,也就是从浏览器缓存中去读取http Status Code 为304。

当Product有数据变化时,这个时间刷新成当前时间,也就是Action从新生成了Html文档返回给浏览器。

5.总结

输出缓存在实际的应用中还是需要自己去体会。在业务逻辑的处理中才更能体会到缓存的重要性。当然数据缓存也很重要,应用非常广泛,所以还是有必要去掌握。写的不足的地方希望给个评论指点一二。

ASP.NET MVC如何使用输出缓存的更多相关文章

  1. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  2. ASP.NET MVC + 工厂模式 + 三层 + 缓存

    最近将手头的项目总结整理了一下,以方便自己的学习.... 下面直接上图先介绍项目的结构图: 项目是ASP.NET MVC 4.0的应用程序,DBUtility这个类库主要是DbHelper操作数据库的 ...

  3. ASP.NET MVC Partial页输出JS

    很多情况Partial是需要引用到JS的,通常做法是吧JS在引用Partial的页面中加入JS文件或者JS代码. 前阵子网上看到一段代码可以在Partial页面中添加JS,输出道引用页面. publi ...

  4. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)

    背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮币”.为了增加趣味性,帮帮币“掉落”之后所有用户都可以“捡取”,谁先捡到 ...

  5. [置顶] MVC输出缓存(OutputCache参数详解)

    1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...

  6. ASP.NET MVC编程——缓存

    Web缓存分为服务端缓存和客户端缓存. 1 服务端缓存 1.1请求域内的缓存:HttpContext.Items 类型: HttpContext.Items的类型为IDictionary,且键和值都是 ...

  7. MVC输出缓存(OutputCache参数详解)

    版权声明:本文为博主原创文章,未经博主允许转载随意. https://blog.csdn.net/kebi007/article/details/59199115 1.学习之前你应该知道这些 几乎每个 ...

  8. 实现asp.net mvc页面二级缓存,提高访问性能

    实现的mvc二级缓存的类 //Asp.Net MVC视图页面二级缓存 public class TwoLevelViewCache : IViewLocationCache { private rea ...

  9. 自学MVC看这里——全网最全ASP.NET MVC 教程汇总

    MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...

随机推荐

  1. jquery mobile 移动web(3)

    可折叠功能块. div 元素的 data-role 属性设置为 collapsible 代码如下: <div data-role="collapsible"> < ...

  2. Keepalived 配置高可用

    VRRP协议及Keepalived原理使用   VRRP 协议即 Virtual Router Redundancy Protocol,虚拟路由器冗余协议, 为了解决局域网内默认网关单点失效的问题.  ...

  3. Linux密钥登录原理和ssh使用密钥实现免密码登陆

    目录 1. 公钥私钥简介 2. 使用密钥进行ssh免密登录 2.1. 实验环境 2.2. 开始实验 3. ssh的两种登陆方式介绍 3.1. 口令验证登录 3.2. 密钥验证登录 4. 总结 1.公私 ...

  4. JS日期去杠,日期转换String转Date

    1.巧妙使用split()和join()替换字符串var str = '2014-05-05';var newstr = str.split('-').join("");split ...

  5. centos7上部署新版 jumpserver 跳板机服务

    CentOS 7 建议在一个纯净的 centos7上进行下面的安装部署 关闭 selinux 和防火墙 [root@jumpserver ~]# setenforce 0 [root@jumpserv ...

  6. PyCharm使用秘籍视频

    PyCharm使用视频上传至企鹅群公告 需要自行添加群获取

  7. hoj第三场G-manhattanp ositioning system

    ---恢复内容开始--- 一.题意 在二维坐标系内,给定若干个点和目标点距离该点的曼哈顿距离,求是否存在唯一解使得目标点坐标为整数. 二.题解 重新思考题目模型,考虑曼哈顿距离一定时,几何含义为,以给 ...

  8. kafka集群部署文档(转载)

    原文链接:http://www.cnblogs.com/luotianshuai/p/5206662.html Kafka初识 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候 ...

  9. RTL8195AM开发板使用

    1. 本次使用RTL8195AM测试一下,原厂资源地址:https://os.mbed.com/platforms/Realtek-RTL8195AM/ 2. 由于板子支持mbed,所以把CON2连接 ...

  10. Datetime与Datetime2的区别

    Datetime:        时间格式,对应于数据库中的DateTime类型,对应于.NET里面的System. DateTime类型.DateTime支持日期从1753年1月1日到9999年12 ...