前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET MVC编程——缓存

ASP.NET MVC编程——缓存

作者头像
甜橙很酸
发布于 2018-03-30 02:11:59
发布于 2018-03-30 02:11:59
2K00
代码可运行
举报
文章被收录于专栏:DOTNETDOTNET
运行总次数:0
代码可运行

Web缓存分为服务端缓存和客户端缓存。

1 服务端缓存

1.1请求域内的缓存:HttpContext.Items

类型:

HttpContext.Items的类型为IDictionary,且键和值都是object类型

访问性:

只存在于当前请求范围内。

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HttpContext.Items["key"] ="value";
var value = HttpContext.Items["key"];

1.2用户域内的缓存:HttpContext.Session

类型:

HttpContext.Session的类型为HttpSessionStateBase,这个类继承自ICollection, IEnumerable,

访问性:

只针对当前用户有效,无法跨用户级别访问。

过期设置:

设置过期时间,当过期时间到达时,服务器便销毁存储在Session里的对象。

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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参数指定依赖的策略。

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 值,否则会抛出异常。

下面是该特性的定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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; }
}

缓存位置枚举值为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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操作为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[OutputCache(Duration=20)]
public ActionResult CacheExe()
{
    ViewBag.TimeNow = DateTime.Now.ToString("yyyyMMdd     hh:mm:ss");
    return View();
}

视图Index.cshtml为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    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消息头

常用设置举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置是否可被客户端或代理缓存
Response.Cache.SetCacheability(HttpCacheability.Public);
//设置过期时间
Response.Cache.SetMaxAge(TimeSpan.FromMinutes(30));
//设置绝对过期时间
Response.Cache.SetExpires(DateTime.Now.AddMinutes(30));

验证缓存数据的有效性

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

常用设置举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置Last-Modified HTTP标头
Response.Cache.SetLastModified(DateTime.Now);
//设置ETag HTTP标头
Response.Cache.SetETag(@"uni:version");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Asp.net mvc 知多少(九)
本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET MVC有更深层次的理解。 由于个人技术水平和英文水平也是有限的,因此错误在所难免,希
圣杰
2018/01/11
8960
Asp.net mvc 知多少(九)
[WCF REST] 通过ASP.NET Output Caching实现声明式缓存
ASP.NET的输出缓存(Output Caching)机制允许我们针对整个Web页面或者页面的某个部分(主要针对用户控件)最终呈现的HTML进行缓存。对于后续针对相同资源的请求,只需要直接将缓存的HTML予以回复而无须按照页面处理生命周期对每次请求进行重复处理。WCF通过操作行为AspNetCacheProfileAttribute利用ASP.NET的输出缓存提供一种针对于某个操作的声明式缓存机制。[源代码从这里下载] 一、AspNetCacheProfileAttribute WCF对ASP.NET缓存
蒋金楠
2018/01/16
8300
ASP.NET MVC ETag & Cache等优化方法
最近有一个项目是用SmartAdmin + Jquery + EasyUI 一个ASP.NET MVC5的项目,一直存在一个性能问题,加载速度比较慢,第一次加载需要(在没有cache的情况下)需要4-5秒完成全部的加载.
阿新
2021/12/24
8720
ASP.NET MVC ETag & Cache等优化方法
ASP.NET 缓存 Cache
ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象. 缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存。 将数据添加到缓存中 1。通过指定其键和值将项添加到缓存中 Cache["txt"] = "a"; 2.通过使用 Insert(重载Insert方法)方法将项添加到缓存中 Cache.Insert("txt", "a"); 下列代码显示如何设置相对过期策略。它插入一个项,该项自上次访问后 10 分钟过期。注意 Date
磊哥
2018/04/26
1.4K0
asp.net core 系列之Response caching(1)
讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching;
Vincent-yuan
2019/09/10
7000
asp.net core 系列之Response caching(1)
一种小型后台管理系统通用开发框架中的Cache缓存设计
本篇博客记录一下我在实习的公司的后台管理系统开发框架中学习到的一种关于网站的缓存(Cache)的实现方法,我会在弄懂的基础上,将该方法在.net core上进行实现。因为公司开发都是基于.net framework的,但是在.net 这一块,.net framework正在逐渐被.net core所取代,而目前公司的前辈们由于开发任务较重,并没有着手使用.net core的打算,所以,我自己打算为公司搭建一个基于.net core的后台开发框架,这对自己是一个挑战,但收获还是很大的,在这个过程中,我学到了很多。下面我记录一下我们公司关于网站设计中Cache的一种设计与实现方法(先说在.net mvc下的实现方法,后续会写另一篇.net core的实现方法):
CherishTheYouth
2019/07/30
5200
一种小型后台管理系统通用开发框架中的Cache缓存设计
ASP.NET cache缓存的用法
本文导读:在.NET运用中经常用到缓存(Cache)对象。有HttpContext.Current.Cache以及HttpRuntime.Cache,HttpRuntime.Cache是应用程序级别的,而HttpContext.Current.Cache是针对当前WEB上下文定义的。HttpRuntime下的除了WEB中可以使用外,非WEB程序也可以使用。
跟着阿笨一起玩NET
2018/09/19
1.3K0
ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试。 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法。 单元测试要满足四个条件:自治的,可重复的,独立的,快速的。 自治的是指:关注于验证某个单一功能,例如只关注于类的某个方法的功能。 可重复的是指:无论何时允许同一段测试代码都应该得到相同的结果。 独立的是指:不依赖与其他任何系统或单元测试。 快速的是指:所有测试都应快速地完成, 集成测试 验证两个或多个组件之间的交互。 验收测试 确保已构建的系统实现了既定的全部功
甜橙很酸
2018/04/17
2.3K0
ASP.NET MVC编程——单元测试
ASP.NET MVC编程——控制器
每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求。 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型。 2操作返回结果 结果类型 调用方法 备注 ContentResult Content 文本类型 FileContentResult/FileStreamResult/FilePathResult File 文件类型 HttpStatusCodeResult(HttpNotFou
甜橙很酸
2018/03/30
2.5K0
ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解
笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理。发现应用程序有一个非常主要的 “传导体” HttpContext 。
痴者工良
2019/08/08
3K0
ASP.Net Core 5.0 MVC Session的添加,及它与Cookie的关系
 从上图中,我们可以看出 session的值,并不会存储在客户端(浏览器),而是会以AspNetCore.Session的形式 将用户SessionId 存储在 浏览器 Cookie 键值对中,以便在下一次请求中方便识别身份。
明志德道
2023/10/21
3040
ASP.Net Core 5.0 MVC Session的添加,及它与Cookie的关系
Asp.NET中常用的一些优化性能的方法
ASP.NET的缓存机制相比ASP有很大的改进,本文档除对常用优化方法进行总结介绍外,强调了如何使数据库
Java架构师必看
2021/03/22
7740
ASP.NET MVC编程——路由
框架自动生成的路由配置 上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs。 代码如下: public class RouteConfig { public
甜橙很酸
2018/03/30
1.9K0
Asp.Net MVC 3.0 使用Gzip压缩
Gzip最早由Jean-loup Gailly和Mark Adler创建,用于Unix系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是Gzip格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。 HTTP协议上的Gzip编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用Gzip压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。
aehyok
2018/09/11
1.3K0
Asp.Net MVC 3.0 使用Gzip压缩
关于WinForm/Web如何使用缓存Cach
相对到期也称滑动到期:设置相对过期时间 指定时间内无访问会失效。(类似Session机制)
跟着阿笨一起玩NET
2018/09/18
1.4K0
Asp.net mvc 知多少(六)
本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET MVC有更深层次的理解。 由于个人技术水平和英文水平也是有限的,因此错误在所难免,希
圣杰
2018/01/11
2.6K0
Asp.net mvc 知多少(六)
ASP.NET 2.0 缓存翻译草稿
ASP.NET 2.0 缓存翻译草稿 命名空间: System.Web.Caching ,这个空间是ASP.NET的基础结构中的重要部分,比如:session就是存储在cache中的。 Cache
田春峰-JCJC错别字检测
2022/05/07
1.1K0
理解ASP.NET Core - Cookie 的身份认证
链接:cnblogs.com/xiaoxiaotank/p/15811749.html
郑子铭
2022/03/22
1.1K0
理解ASP.NET Core - Cookie 的身份认证
[转]ASP.NET 缓存:方法和最佳实践
  原文链接:http://msdn.microsoft.com/zh-cn/library/aa478965.aspx
拓荒者IT
2019/09/26
1.7K0
ASP.NET MVC路由扩展:路由映射
上周我写了三篇文章(一、二、三)详细地介绍了ASP.NET的路由系统。ASP.NET的路由系统旨在通过注册URL模板与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但是对于ASP.NET MVC应用来说,请求的目标不再是一个具体的物理文件,而是定义在某个Controller类型中的Action方法。出于自身路由特点的需要,ASP.NET对ASP.NET的路由系统进行了相应的扩展。 目录 一、基本路由映射 二、实例演示:注册路由映射与查看路由信息 三、基于A
蒋金楠
2018/01/15
1.5K0
ASP.NET MVC路由扩展:路由映射
相关推荐
Asp.net mvc 知多少(九)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验