详解Asp.Net Core 2.1+的视图缓存(响应缓存)
响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持。 此功能将支持ASP.NET 核心 2.1 版本。
在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保持同一个参数的请求,在N段时间内,直接从mvc的缓存中读取,不去走视图的逻辑。
[OutputCache(Duration =20)]//设置过期时间为20秒
public ActionResult ExampleCacheAction()
{
var time=DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
ViewBag.time= time;
return View();
}
在Asp.Net core 2.1中,官方文档上称:响应缓存可减少客户端或代理对 web 服务器的请求数。 响应缓存还可减少量工作的 web 服务器执行程序生成响应。 响应缓存由标头,指定你希望客户端、 代理和缓存响应的中间件如何控制。
在Asp.Net Core 2.1 中,没有了OutputCache,换成了ResponseCache,ResponseCache必须带一个参数:Duration 单位为秒,最少设置一秒钟
[ResponseCache(Duration = 5)]
public IActionResult About()
{ ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); return View();
}
然后再浏览器请求这个视图

在浏览器的响应头的Cache-Control 中出现max-age=5, Http协议对此的解释是
客户端将不会接受其保留时间大于指定的秒数的响应。 示例:max-age=60(60 秒),max-age=2592000(1 个月)
如果在浏览器中禁用缓存,那么ResponseCache不会有任何效果
Vary过滤
[ResponseCache(VaryByHeader = "User-Agent", Duration = 5)]
public IActionResult About()
{ ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); return View();
}

关于vary在Http响应头的作用就是:告诉缓存服务器或者CDN,我还是同一个浏览器的请求,你给我缓存就行了,如果你换个浏览器去请求,那么vary的值肯定为空,那么缓存服务器就会认为你是一个新的请求,就会去读取最新的数据给浏览器
参考资料:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
禁用缓存(NoStore 和 Location.None)
在Http中 :no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult About()
{ ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); return View();
}
ResponseCacheLocation.None是在Cache-Control设置一个no-cache属性,让浏览器不缓存当前这个URL
缓存配置(CacheProfiles)在一个正常的项目中,肯定有很多个控制器,但是不可能每个控制器的缓存策略都一样,这时候,我们就需要一个缓存的配置来灵活应对这个问题在mvc的服务注入的时候,我们可以在option里面注入进我们的缓存策略
services.AddMvc(option=> {
option.CacheProfiles.Add("test1", new CacheProfile()
{
Duration = 5
});
option.CacheProfiles.Add("test2", new CacheProfile()
{
Location = ResponseCacheLocation.None,
NoStore = true
});
});
然后我们在使用的时候,直接使用配置策略的名称就好了
[ResponseCache(CacheProfileName = "test1")]
public IActionResult About()
{ ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); return View();
}
这样我们就能和之前在特性后边配置一样了,而且代码看起来也清爽了不少
总结:对于响应缓存,我个人的理解就是:MVC通过返回HTTP响应头,让浏览器在多少时间内,执行刷新操作的时候,不请求服务器,直接从缓存读取。。。
详解Asp.Net Core 2.1+的视图缓存(响应缓存)的更多相关文章
- 详解ASP.NET Core API 的Get和Post请求使用方式
上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题,欢迎一起讨论.所以下面重点详细讲解我们常用的Get和Post请求( 以.net core2.2的Http[Verb]为方向 ,推荐该 ...
- 详解ASP.NET Core Docker部署
前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ...
- 详解 ASP.NET Core MVC 的设计模式
MVC 是什么?它是如何工作的?我们来解剖它 在本节课中我们要讨论的内容: 什么是 MVC? 它是如何工作的? 什么是 MVC MVC 由三个基本部分组成 - 模型(Model),视图(View)和控 ...
- 三张图片详解Asp.Net 全生命周期
用三张图片详解Asp.Net 全生命周期 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1 第一张图片从全局说明从客户端 ...
- 详解ASP.NET MVC 控制器
1 概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由 一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...
- 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”
来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...
- 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】
Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Changing vi ...
- ASP.NET Core MVC 中自定义视图
ASP.NET Core MVC 中的视图发现 ASP.NET Core MVC 中有提供了几个 View()的重载方法. 如果我们使用下面提供 View()的重载方法,它将查找与 Action 方法 ...
- 【ASP.Net Core】不编译视图文件
原文:[ASP.Net Core]不编译视图文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aqtata/article/details/818 ...
随机推荐
- 解决ps不能直接把文件拖进去的问题
在运行里输入regedit,然后确定,在里面按照HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows > CurrentVer ...
- ubuntu配置neuwork网络
ubuntu 网络配置 检查网络配置命令:ifconfig 一.通过配置文件配置 新手没怎么用过Ubuntu,所以走了不少弯路,网上找了很多方法,大都没对我起到帮助作用,所以把自己的配置方法写一写. ...
- python安装代码包提示缺少 VC++ 14 控件的处理方式
下载如下文件,然后安装 http://go.microsoft.com/fwlink/?LinkId=691126
- 抛开visual studio,纯手工创建asp.net mvc遇到的问题
脱离Visual Studio,只用文本编辑器..NET Framework.IIS Express创建ASP.NET MVC应用时,需要精简~/View目录下web.config文件内容,之前创建的 ...
- html网页调用本地exe程序的实现方法:
html网页调用本地exe程序的实现方法:1.新建注册表具体文件: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\hhtpexe] [ ...
- Qt代码吐槽
擦,代码注释里写这么多“NB!”是要闹哪样!!
- SpringBoot实现跨域
一.什么是跨域请求? 跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样.说白了就是ip.网络协议.端口都一样的时候,就是同一个域,否则就是跨域.这是由 ...
- docker安装mysql容器后,是用navicat连接报client does not support authentication protocol requested by server consider upgrading mysql client
#进入容器 docker exec -it mysql bash#进入mysqlmysql -u root -p#重置密码ALTER USER 'root'@'%' IDENTIFIED WITH m ...
- register form code(2nd week blog)
register form code(2nd week blog) 注册 用户名: 密码: 确认密码: 邮箱: 电话: 性别: 男 女
- PTA——出现次数最多的数
PTA 7-58 求整数序列中出现次数最多的数 #include<stdio.h> #define N 1000 int main() { ,flag; ]; scanf("%d ...