MVC4的缓存
MVC3缓存之一:使用页面缓存
在MVC3中要如果要启用页面缓存,在页面对应的Action前面加上一个OutputCache属性即可。
我们建一个Demo来测试一下,在此Demo中,在View的Home目录下的Index.cshtml中让页面输入当前的时间。
- @{
- Layout = null;
- }
- <!DOCTYPE html>
- <html>
- <head>
- <title>Index</title>
- </head>
- <body>
- <div>
- <h2>
- 现在时间:@DateTime.Now.ToString("T")</h2>
- </div>
- </body>
- </html>
在Controllers中添加对应的Action,并加上OutputCache属性。
- [HandleError]
- public class HomeController : Controller
- {
- [OutputCache(Duration = 5, VaryByParam = "none")]
- public ActionResult Index()
- {
- return View();
- }
- }
刷新页面即可看到页面做了一个5秒的缓存。当页面中数据不是需要实时的呈现给用户时,这样的页面缓存可以减小实时地对数据处理和请求,当然这是针对整个页面做的缓存,缓存的粒度还是比较粗的。
缓存的位置
可以通过设置缓存的Location属性,决定将缓存放置在何处。
Location可以设置的属性如下:
Location的默认值为Any。一般推荐将用户侧的信息存储在Client端,一些公用的信息存储在Server端。
加上Location应该像这样。
- [HandleError]
- public class HomeController : Controller
- {
- [OutputCache(Duration = 5, VaryByParam = "none", Location = OutputCacheLocation.Client, NoStore = true)]
- public ActionResult Index()
- {
- return View();
- }
- }
缓存依赖
VaryByParam可以对缓存设置缓存依赖条件,如一个产品详细页面,可能就是根据产品ID进行缓存页面。
缓存依赖应该设置成下面这样。
在MVC3中对输出缓存进行了改进,OutputCache不需要手动指定VaryByParam,会自动使用Action的参数作为缓存过期条件。
- [HandleError]
- public class HomeController : Controller
- {
- [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
- public ActionResult Index()
- {
- return View();
- }
- }
另一种通用的设置方法
当我们需要对多个Action进行统一的设置时,可以在web.config文件中统一配置后进行应用即可。
在web.config中配置下Caching节点
- <caching>
- <outputCacheSettings>
- <outputCacheProfiles>
- <add name="Cache1Hour" duration="3600" varyByParam="none"/>
- </outputCacheProfiles>
- </outputCacheSettings>
- </caching>
那么在Action上使用该配置节点即可,这样的方法对于统一管理配置信息比较方便。
- [HandleError]
- public class HomeController : Controller
- {
- [OutputCache(CacheProfile = "Cache1Hour")]
- public ActionResult Index()
- {
- return View();
- }
- }
MVC3缓存之二:页面缓存中的局部动态
MVC中有一个Post-cache substitution的东西,可以对缓存的内容进行替换。
使用Post-Cache Substitution
- 定义一个返回需要显示的动态内容string的方法。
- 调用HttpResponse.WriteSubstitution()方法即可。
示例,我们在Model层中定义一个随机返回新闻的方法。
- using System;
- using System.Collections.Generic;
- using System.Web;
- namespace MvcApplication1.Models
- {
- public class News
- {
- public static string RenderNews(HttpContext context)
- {
- var news = new List<string>
- {
- "Gas prices go up!",
- "Life discovered on Mars!",
- "Moon disappears!"
- };
- var rnd = new Random();
- return news[rnd.Next(news.Count)];
- }
- }
- }
然后在页面中需要动态显示内容的地方调用。
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
- <%@ Import Namespace="MvcApplication1.Models" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head runat="server">
- <title>Index</title>
- </head>
- <body>
- <div>
- <% Response.WriteSubstitution(News.RenderNews); %>
- <hr />
- The content of this page is output cached.
- <%= DateTime.Now %>
- </div>
- </body>
- </html>
如在上面文章中说明的那样,给Controller加上缓存属性。
- using System.Web.Mvc;
- namespace MvcApplication1.Controllers
- {
- [HandleError]
- public class HomeController : Controller
- {
- [OutputCache(Duration=60, VaryByParam="none")]
- public ActionResult Index()
- {
- return View();
- }
- }
- }
可以发现,程序对整个页面进行了缓存60s的处理,但调用WriteSubstitution方法的地方还是进行了随机动态显示内容。
对Post-Cache Substitution的封装
将静态显示广告Banner的方法封装在AdHelper中。
- using System;
- using System.Collections.Generic;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcApplication1.Helpers
- {
- public static class AdHelper
- {
- public static void RenderBanner(this HtmlHelper helper)
- {
- var context = helper.ViewContext.HttpContext;
- context.Response.WriteSubstitution(RenderBannerInternal);
- }
- private static string RenderBannerInternal(HttpContext context)
- {
- var ads = new List<string>
- {
- "/ads/banner1.gif",
- "/ads/banner2.gif",
- "/ads/banner3.gif"
- };
- var rnd = new Random();
- var ad = ads[rnd.Next(ads.Count)];
- return String.Format("<img src='{0}' />", ad);
- }
- }
- }
这样在页面中只要进行这样的调用,记得需要在头部导入命名空间。
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
- <%@ Import Namespace="MvcApplication1.Models" %>
- <%@ Import Namespace="MvcApplication1.Helpers" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head runat="server">
- <title>Index</title>
- </head>
- <body>
- <div>
- <% Response.WriteSubstitution(News.RenderNews); %>
- <hr />
- <% Html.RenderBanner(); %>
- <hr />
- The content of this page is output cached.
- <%= DateTime.Now %>
- </div>
- </body>
- </html>
使用这样的方法可以使得内部逻辑对外呈现出更好的封装。
MVC3缓存之三:MVC3中的局部缓存(Partial Page)
版本中,新增了一个叫做Partial
Page的东西,即可以对载入到当前页面的另外的一个View进行缓存后输出,这与我们之前讨论的局部动态刚好相反了,即之前我们进行这个页面的缓存,然
后对局部进行动态输出,现在的解决方案是:页面时动态输出的,而对需要缓存的局部进行缓存处理。查来查去还没有看到局部动态的解决方案,所以我们先看看局
部缓存的处理方法。
局部缓存(Partial Page)
我们先建立一个需要局部缓存的页面View,叫做PartialCache.cshtml,页面内容如下:
- <p>@ViewBag.Time2</p>
在其对应的Controller中添加对应的Action
- [OutputCache(Duration = 10)]
- public ActionResult PartialCache()
- {
- ViewBag.Time2 = DateTime.Now.ToLongTimeString();
- return PartialView();
- }
我们可以看到对其Action做了缓存处理,对页面进行缓存10秒钟。
而在Index的View中调用此缓存了的页面则需要这样:
- @{
- ViewBag.Title = "Index";
- }
- <h2>
- OutputCache Demo</h2>
- <p>
- No Cache</p>
- <div>@DateTime.Now.ToLongTimeString()
- </div>
- <br />
- <p>
- Partial Cache 10 mins
- </p>
- <div class="bar2">@Html.Action("PartialCache", "Index", null)</div>
运行后,我们刷新页面可以发现Index的主体没有缓存,而引用到的PartialCache进行了10秒缓存的处理。
MVC4的缓存的更多相关文章
- Mvc4页面缓存设置Cookie导致缓存失效
[OutputCache(Duration = 60, VaryByParam = "none")] public ActionResult Index() ...
- ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...
- [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)
目录 1. 介绍 2. 软件环境 3. 在运行示例代码之前(源代码 + 示例登陆帐号) 4. jqGrid和AJAX 5. GridSettings 6. ...
- MVC缓存
MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...
- SignalR + KnockoutJS + ASP.NET MVC4 实现井字游戏
1.1.1 摘要 今天,我们将使用SignalR + KnockoutJS + ASP.NET MVC实现一个实时HTML5的井字棋游戏. 首先,网络游戏平台一定要让用户登陆进来,所以需要一个登陆模块 ...
- 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)
一.背景 在越来越重视用户体验的今天,换肤功能也慢慢被重视起来.一个web系统用户可以选择一个自己喜欢的系统主题,在用户眼里还是会多少加点分的.我们很开心的是easyui v1.3.4有自带defau ...
- MVC缓存OutputCacheAttribute 类提高网站效率(转)
原文转自:http://www.cnblogs.com/iamlilinfeng/p/4419362.html 命名空间: System.Web.Mvc 程序集: System.Web.Mvc(在 ...
- MVC4+WebApi+Redis Session共享练习(下)
上一篇文章我们主要讲解了一些webApi和redis缓存操作,这篇文章我们主要说一些MVC相关的知识(过滤器和错误处理),及采用ajax调用webApi服务. 本篇例子采用的开发环境为:VS2010( ...
- MVC4+WebApi+Redis Session共享练习(上)
这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下.本文也会接触一点webApi的 ...
随机推荐
- hadoop FileSplit
/** A section of an input file. Returned by {@link * InputFormat#getSplits(JobContext)} and passed t ...
- 简单说说DNS劫持_firefox吧_百度贴吧
简单说说DNS劫持_firefox吧_百度贴吧 DNSSEC
- ctags 小记
转:http://www.cnblogs.com/napoleon_liu/archive/2011/01/23/1942738.html 简介 ctags − Generate tag files ...
- CAD中如何裁剪需要的区域
M1: 先转换为块的方式进行裁剪 大范围框选复制出来>>B命令生成块>>XC命令>>选择刚才生成的块>>空格>>新边界>>框选新 ...
- mq使用经验
1.Producer使用指南--发送消息注意事项 1.正常情况下一个业务系统尽可能用一个Topic,消息子类型用tags来标识,tags可以由业务系统自由设置.只有发送消息设置了tags,消费方在订阅 ...
- Android Studio使用过程中Java类突然报红,但项目可运行解决方案
1.点击File->Invalidate Caches / Restart... 2.重启Gradle,清除缓存 3.Clean Project
- [Functional Programming] Pull Many Random Numbers in a Single State ADT Transaction
We have the ability to select a single random card from a pile of twelve cards, but we would like to ...
- sipp中的action使用方法
最近在做sip服务器的压力测试 场景:当主叫收到200 Ok之后要将Contact 头域中的字段放在ACK消息中的请求行和to头域中发给被叫 查看sipp官网文档就使用action, 在主叫脚本中增加 ...
- 【Java】Java_14 循环结构
循环结构 当型:当P条件成立时(T),反复执行A,直到P为“假”时才停止循环. 直到型:先执行A, 再判断P,若为T,再执行A,如此反复,直到P为F. 1.While循环 while循环的基本格式和流 ...
- python 排序函数
1.sorted()函数:内建函数,适用于所有类型,返回排序后的对象,原对象不改变,sorted(a,key=,reversed=True) >>> sorted((3,1,4,2) ...