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 = 20;

或配置
<system.web>
  <sessionState timeout="20" />
</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 = 0,
        //输出缓存位于产生请求的浏览器客户端上。 此值对应于System.Web.HttpCacheability.Private 枚举值。
        Client = 1,        
        //输出缓存可存储在任何 HTTP 1.1 可缓存设备中,源服务器除外。 这包括代理服务器和发出请求的客户端。
        Downstream = 2,        
        //输出缓存位于处理请求的 Web 服务器上。 此值对应于 System.Web.HttpCacheability.Server 枚举值。
        Server = 3,       
        //对于请求的页,禁用输出缓存。 此值对应于 System.Web.HttpCacheability.NoCache 枚举值。
        None = 4,      
        //输出缓存只能存储在源服务器或发出请求的客户端中。 代理服务器不能缓存响应。 此值对应于 System.Web.HttpCacheability.Private和 System.Web.HttpCacheability.Server 枚举值的组合。
        ServerAndClient = 5,
}

例:

控制器Home的CacheExe操作为:

[OutputCache(Duration=20)]
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(30));
//设置绝对过期时间
Response.Cache.SetExpires(DateTime.Now.AddMinutes(30));

验证缓存数据的有效性

通过服务端对http消息头进行设置,以便客户端可以验证数据有效性。

常用设置举例:

//设置Last-Modified HTTP标头
Response.Cache.SetLastModified(DateTime.Now);
//设置ETag HTTP标头
Response.Cache.SetETag(@"uni:version");

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极乐技术社区

小程序支付详解+源码(客户端+服务端)

小程序的支付调通,和大家分享下(坑) 包括小程序端、java服务器端 和其他方式的微信支付方式区别不大,也都需要经过统一下单、支付结果通知(回调),具体流程如...

2475
来自专栏黑泽君的专栏

SolrCloud搭建 + zookeeper集群搭建 + 搜索功能切换到集群版 + httpclient学习 + 全局异常处理器

索引集合包括两个Shard(Shard1和Shard2),Shard1和Shard2分别由三个Core组成,其中一个Leader两个Replication,L...

1982
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件

上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手...

2116
来自专栏木宛城主

SharePoint自动化部署,利用PowerShell 导入用户至AD——PART II

这是对上一篇文章《SharePoint自动化部署,利用PowerShell 导出/导入AD中的用户》进行补充。开发时,为了测试和演示,我们往往需要经常性的把用...

2558
来自专栏菩提树下的杨过

CKEditor/CKFinder升级心得

这几天把一个旧项目中的fckeditor升级为ckeditor 3.2 + ckfinder 1.4.3 组合,下面是一些升级心得: 一、CKFinder的若干...

3797
来自专栏程序你好

不同的.Net版本客户端软件调用Java Web Service区别

最近的系统中需要.Net开发的离线端软件通过Web Service技术和Java开发的在线系统进行数据交互。

1183
来自专栏运维一切

laravel自定义错误页面 原

app\Exceptions\handler.php 在render的时候就携带了这个异常

1213
来自专栏技术博客

Asp.Net Mvc3.0(MEF依赖注入实例)

在http://www.cnblogs.com/aehyok/p/3386650.html前面一节主要是对MEF进行简单的介绍。本节主要来介绍如何在Asp.Ne...

952
来自专栏逸鹏说道

Linux 部署ASP.NET SQLite 应用 的坎坷之旅 附demo及源码

Linux 部署ASP.NET SQLite 应用 的坎坷之旅。文章底部 附示例代码。 有一台闲置的Linux VPS,尝试着部署一下.NET 程序,结果就踏上...

3933
来自专栏云端漫步

go设计模式之单例模式

单例模式在系统设计中很常用,如数据库的连接对象等,该类只有一个实例存在,实现很简单,就是在创建实例时,判断一下,实例是否已经存在。

1160

扫码关注云+社区

领取腾讯云代金券