ASP.NET MVC编程——缓存
Web缓存分为服务端缓存和客户端缓存。
1 服务端缓存
1.1请求域内的缓存:HttpContext.Items
类型:
HttpContext.Items的类型为IDictionary,且键和值都是object类型
访问性:
只存在于当前请求范围内。
例:
HttpContext.Items["key"] ="value";
var value = HttpContext.Items["key"];
1.2用户域内的缓存:HttpContext.Session
类型:
HttpContext.Session的类型为HttpSessionStateBase,这个类继承自ICollection, IEnumerable,
访问性:
只针对当前用户有效,无法跨用户级别访问。
过期设置:
设置过期时间,当过期时间到达时,服务器便销毁存储在Session里的对象。
例:
HttpContext.Session["key"] = "value";
var value = (string)HttpContext.Session["key"];
//设置超时时间为20分钟
HttpContext.Session.Timeout = ;
或配置
<system.web>
<sessionState timeout="" />
</system.web>
1.3应用程序域内的缓存:HttpContext.Application,HttpContext.Cache
类型:
HttpContext.Application类型为HttpApplicationStateBase,此类继承自NameObjectCollectionBase, ICollection, IEnumerableHttpContext.Cache为Cache类型,此类继承自IEnumerable
访问性:
他们的生命周期和IIS工作进程一样长,但HttpContext.Cache不能跨工作进程。
过期机制:
HttpContext.Cache可以对缓存数据设置过期机制,有两种方式:一是最后一次访问之后多长时间过期,另一种是设定过期时间点。这两种过期策略不能同时使用。
缓存依赖:
Cache提供了下面的方法来设置缓存依赖
public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)
或者添加值的时候设置缓存依赖:
public void Insert(string key, object value, CacheDependency dependencies);
其中我们可以通过dependencies参数指定依赖的策略。
例:
HttpContext.Application["key"] = "value";
var value = (string)HttpContext.Application["key"];
HttpContext.Cache["key"] = "value";
var value = (string)HttpContext.Cache["key"];
1.4输出缓存
使用OutputCacheAttribute属性将控制器操作渲染的操作结果保存到缓存过滤器。可以利用它实现甜甜圈洞缓存,即缓存部分内容,而允许外围数据变化。使用此特性的时候要注意:子操作的 OutputCacheAttribute 仅支持 Duration、VaryByCustom 和 VaryByParam 值。不能为子操作设置 CacheProfile、Location、NoStore、SqlDependency、VaryByContentEncoding 或 VaryByHeader 值,否则会抛出异常。
下面是该特性的定义。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter
{
//获取或设置缓存持续时间(以秒为单位)
public int Duration { get; set; }
//获取或设置数据存储位置
public OutputCacheLocation Location { get; set; }
//是否存储缓存
public bool NoStore { get; set; }
//获取或设置基于参数变化的值
public string VaryByParam { get; set; }
}
缓存位置枚举值为:
public enum OutputCacheLocation
{
//输出缓存可位于产生请求的浏览器客户端、参与请求的代理服务器(或任何其他服务器)或处理请求的服务器上。 此值对应于 System.Web.HttpCacheability.Public枚举值。
Any = ,
//输出缓存位于产生请求的浏览器客户端上。 此值对应于System.Web.HttpCacheability.Private 枚举值。
Client = ,
//输出缓存可存储在任何 HTTP 1.1 可缓存设备中,源服务器除外。 这包括代理服务器和发出请求的客户端。
Downstream = ,
//输出缓存位于处理请求的 Web 服务器上。 此值对应于 System.Web.HttpCacheability.Server 枚举值。
Server = ,
//对于请求的页,禁用输出缓存。 此值对应于 System.Web.HttpCacheability.NoCache 枚举值。
None = ,
//输出缓存只能存储在源服务器或发出请求的客户端中。 代理服务器不能缓存响应。 此值对应于 System.Web.HttpCacheability.Private和 System.Web.HttpCacheability.Server 枚举值的组合。
ServerAndClient = ,
}
例:
控制器Home的CacheExe操作为:
[OutputCache(Duration=)]
public ActionResult CacheExe()
{
ViewBag.TimeNow = DateTime.Now.ToString("yyyyMMdd hh:mm:ss");
return View();
}
视图Index.cshtml为:
<div class="jumbotron">
<h1>ASP.NET</h1>
<p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
<p><a href="http://asp.net" class="btn btn-primary btn-lg">Learn more »</a></p>
</div>
<div class=”part”>
@Html.Action("CacheExe")
</div>
<div class="row">
......
</div>
视图CacheExe.cshtml为:
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<div>
<h1>@ViewBag.TimeNow</h1>
</div>
</body>
</html>
分析:
当渲染页面时,class为part的<div>部分从缓存中取值,其他部分动态变化。由于CacheExe操作每调用一次就会计算一次当前时间,并将其付给ViewBag.TimeNow,那么如果在20s内刷新一次页面,显示的时间不变的话,就如我们设想的那样,系统将子操作调用的视图缓存了起来,过期时间为这里设置的20s
1.5甜甜圈缓存
只缓存页面的外围部分,允许一部分内容动态变化。
ASP.NET MVC 不支持甜甜圈缓存,使用MvcDonutCachingNuGet包扩展了HTML方法,支持这种缓存方式。
2客户端缓存
浏览器缓存
浏览器将从服务器获取的资源保存到本地,然后当再次发起请求并且请求url与以往请求url之一相同时,浏览器会优先查看本地磁盘,加载本地缓存资源。如果请求url不同,那么浏览器会获取网络资源。
在服务器端设置http消息头
常用设置举例:
//设置是否可被客户端或代理缓存
Response.Cache.SetCacheability(HttpCacheability.Public);
//设置过期时间
Response.Cache.SetMaxAge(TimeSpan.FromMinutes());
//设置绝对过期时间
Response.Cache.SetExpires(DateTime.Now.AddMinutes());
验证缓存数据的有效性
通过服务端对http消息头进行设置,以便客户端可以验证数据有效性。
常用设置举例:
//设置Last-Modified HTTP标头
Response.Cache.SetLastModified(DateTime.Now);
//设置ETag HTTP标头
Response.Cache.SetETag(@"uni:version");
转载与引用请注明出处。 时间仓促,水平有限,如有不当之处,欢迎指正。
ASP.NET MVC编程——缓存的更多相关文章
- ASP.NET MVC 编程参考
ASP.NET MVC 编程参考 转载请注明出处:http://surfsky.cnblogs.com MVC 参考 http://msdn.microsoft.com/zh-cn/dd40 ...
- ASP.NET MVC编程——控制器
每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求. 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型. 2操作返回结果 结果类型 调用方法 备注 ...
- ASP.NET MVC编程——验证、授权与安全
1 验证 一般采用表单验证完成登陆验证,建议结合SSL使用.为限制控制器只能执行HTTPS,使用RequireHttpsAttribute 2 授权 对账户的权限的控制可以通过在控制器或控制器操作上 ...
- ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...
- ASP.NET MVC编程——视图
1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...
- ASP.NET MVC编程——模型
1 ViewModel 是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用. 2模型绑定 默 ...
- ASP.NET MVC编程——错误处理与日记
ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...
- ASP.NET MVC编程——路由
框架自动生成的路由配置 上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs. 代码如下: public class RouteConfig { public static ...
- ASP.NET MVC 3:缓存功能的设计问题
今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...
随机推荐
- 笔记本CPU低压和标压有什么区别?
笔记本CPU英文称Mobile CPU(移动CPU),它除了追求性能,也追求低热量和低耗电,最早的笔记本电脑直接使用台式机的CPU,但是随CPU主频的提高, 笔记本电脑狭窄的空间不能迅速散发CPU产生 ...
- Java中的a++和++a的区别
1.a++和++a的区别 a++表示先将a放在表达式中运算,然后再加1: ++a表示先将a加1,然后再放在表达式中运算 2.实例 (1)Java代码 /** * @Title:JiaJia.java ...
- HighCharts之2D条状图
HighCharts之2D条状图 1.HighCharts之2D条状图源码 bar.html: <!DOCTYPE html> <html> <head> < ...
- Linux显示历史记录
Linux显示历史记录 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ history 1 uname -a 2 lsusb 3 df -h 4 ps -A 5 ...
- java重写和重载
方法的重载: 在一个类中的两个或两个以上的方法,他们方法名相同但是参数列表不同,这种方式称为方法的重载,方法的重载是实现多态性的方式之一. 参数列表不同指的是参数的个数不同或相同的个数但顺序不同或者类 ...
- 芝麻HTTP:PhantomJS的安装
PhantomJS是一个无界面的.可脚本编程的WebKit浏览器引擎,它原生支持多种Web标准:DOM操作.CSS选择器.JSON.Canvas以及SVG. Selenium支持PhantomJS,这 ...
- python中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- Spring Security验证流程剖析及自定义验证方法
Spring Security的本质 Spring Security本质上是一连串的Filter, 然后又以一个独立的Filter的形式插入到Filter Chain里,其名为FilterChainP ...
- C#密封类和密封方法--C#基础
1.密封类 1)不是所有的类都可以继承,不能别继承的类叫做密封类.如果一个类不希望被继承.被派生可以采用关键字sealed,下面Class2不能继承Class1 Class1.cs: namespac ...
- Linux性能分析工具top命令详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. top命令说明 [www.linuxidc.com@linuxidc-t-tomcat-1 ...