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项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...
随机推荐
- javascript获取网页地址栏的id
//获取网页的uid (function ($) { $.getUrlParam = function (name) { var reg = new RegExp("(^|&)&qu ...
- 关于服务器的CPU的几个概念学习总结
物理CPU 物理CPU: 物理CPU是指插在主板上面的CPU芯片.即指在主板上肉眼能看到的CPU的个数.一般而言,个人台式机或笔记本上只会有一个物理CPU芯片.而服务器主板上往往有多个物理CPU. L ...
- R用户的福音︱TensorFlow:TensorFlow的R接口
------------------------------------------------------------ Matt︱R语言调用深度学习架构系列引文 R语言︱H2o深度学习的一些R语言实 ...
- R语言︱情感分析—词典型代码实践(最基础)(一)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:词典型情感分析对词典要求极高,词典中 ...
- 项目部署到Tomcat报错
1.今天晚上,我想把dojo项目部署到Tomcat中,结果发现部署不了,Tomcat报错.而且,这个错误白天时也碰到了. 错误具体详细如下: Publishing failed with multip ...
- am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试
StarterWare在AM335X上的烧录运行 步骤:1.下载安装StarterWare,我们团购的SK需要02.00.00.07版本.最近外网访问慢,我上传到论坛.2.找一张miniSD卡,不需要 ...
- 【原】Java学习笔记029 - 映射
package cn.temptation; import java.util.HashMap; import java.util.Map; public class Sample01 { publi ...
- The Eclipse executable launcher was unable to locate its companion launcher jar的解决方法
大家都知道eclipse是免安装的,基本上解压就能用,但是笔者在解压后打开eclipse时遇到一个奇葩的问题,如题目所示. 在网上搜了半天,基本上都说的是:The Eclipse executable ...
- jsonp的案例
一,转发一 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性.看起来不知道什么意思,实践一下就知道了. 1.随便建两个网页 一 ...
- xml的SAX解析和dom解析的区别
一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...