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.ApplicationHttpContext.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 &raquo;</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编程——缓存的更多相关文章

  1. ASP.NET MVC 编程参考

    ASP.NET MVC 编程参考   转载请注明出处:http://surfsky.cnblogs.com MVC    参考 http://msdn.microsoft.com/zh-cn/dd40 ...

  2. ASP.NET MVC编程——控制器

    每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求. 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型. 2操作返回结果 结果类型 调用方法 备注 ...

  3. ASP.NET MVC编程——验证、授权与安全

    1 验证  一般采用表单验证完成登陆验证,建议结合SSL使用.为限制控制器只能执行HTTPS,使用RequireHttpsAttribute 2 授权 对账户的权限的控制可以通过在控制器或控制器操作上 ...

  4. ASP.NET MVC编程——单元测试

    1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...

  5. ASP.NET MVC编程——视图

    1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...

  6. ASP.NET MVC编程——模型

    1 ViewModel 是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用. 2模型绑定 默 ...

  7. ASP.NET MVC编程——错误处理与日记

    ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...

  8. ASP.NET MVC编程——路由

    框架自动生成的路由配置 上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs. 代码如下: public class RouteConfig { public static ...

  9. ASP.NET MVC 3:缓存功能的设计问题

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...

随机推荐

  1. Struts2实现文件上传(三)

    Struts2实现文件上传 配置文件web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  2. The currently displayed page contains invalid values.

    1 错误描述 2 错误原因 3 解决办法

  3. MPEG2_TS流基本概念和数据结构

    时对应network_PID,program_number等于其它值时对应program_map_PID. (3)PMT   PMT数据结构如下: TS_program_map_section(){ ...

  4. 电脑中安装多个jdk,eclipse的选择!

    以前自己写java程序的时候,没有用到什么高级的东西,所以没咋关注eclipse中jdk的版本问题: 但是随着学习的深入,难免会用到别人的项目,那么在导入别人的项目过程中就会发现时长有问题,而很多情况 ...

  5. JavaScript设计模式(9)-享元模式

    享元模式 1. 介绍 一种优化模式 适合解决因创建大量类似对象而累积性能问题 javaScript 代码可能很快就用光浏览器的内容,通过把大量独立对象转化为少量共享对象,可以降低运行 Web 应用所需 ...

  6. SOA和微服务架构

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...

  7. 省市区/国籍 多级联动-jq

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 12-7jquery选择器学习

    p:odd 选择奇数个数的p标签   p:even选择奇数个数的p标签   p:gt(n)选择下标 大于n的p标签   p:lt(n)选择下标小于n的p标签   $(":root " ...

  9. 都在说RunLoop...... 到底什么是RunLoop?

    RunLoop(消息循环):说白了就是一种事件监听循环.就好比是一个while循环,监听到事件就起来,没有就休息. 介绍: 它可以在不同模式下进行切换,iOS有五种模式,其中UIInitializat ...

  10. Mybatis【逆向工程,缓存,代理】知识要点

    前言 本文主要讲解Mybatis的以下知识点: Mybatis缓存 一级缓存 二级缓存 与Ehcache整合 Mapper代理 使用Mapper代理就不用写实现类了 逆向工程 自动生成代码 Mybat ...