HTTP响应的缓存意味着当发出HTTP请求时,服务器生成的响应由浏览器或服务器存储在某个地方,以便在对同一资源的连续HTTP请求中重复使用。实质上,我们正在存储生成的响应,并将该响应重用于后续请求一段时间。存储可以在客户端进行,例如浏览器或服务器端本身。当存储在客户端时,HTTP响应的缓存减少了客户端(例如浏览器或代理)对Web服务器的请求数。Web应用程序中的浏览器缓存行为通常由指定客户端必须如何缓存响应的HTTP报头控制。

在Web应用程序中,需要缓存某些性能请求。例如,通过缓存很少更改或不经常更改的资源来提高应用程序的性能,因为这会从服务器中删除不必要的工作。另一方面,可能不会缓存某些可能经常更改的资源,以便向客户端提供最新资源。因此,需要缓存某些资源并禁止缓存某些其他资源。

在典型的HTTP请求和响应中,缓存由“Cache-Control” 报头控制。报头可以告诉缓存什么以及客户端和服务器的时间长度。在.NET Core MVC中,可以指定缓存使用ResponseCache属性。

向操作方法添加缓存行为的一种简单方法是使用ResponseCache特性来修饰方法。为了使客户端缓存响应,可以使用[ResponseCache(Duration = 30)] 修饰控制器内的操作方法。此特性将标记客户端以响应缓存30秒。可以通过使用[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]特性来禁用响应的缓存,其中NoStore标志设置为true,CachingLocation设置为None。

下面的示例显示来自Index()和Privacy()方法的响应被缓存30秒。我们的想法是,这些方法生成的内容预计会保持不变。GetValue()方法的响应不应该缓存,因为预期此方法的响应会从一个请求更改为另一个请求。因此,禁用缓存由NoStore = true和Location = ResponseCacheLocation.None指示。

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; namespace Web.Controllers
{
public class HomeController : Controller
{
[ResponseCache(Duration = )]
public IActionResult Index()
{
return View();
} [ResponseCache(Duration = )]
public IActionResult Privacy()
{
return View();
} [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult GetValue()
{
return View();
}
}
}

为了对类的所有操作方法使用相同的缓存行为,[ResponseCache]可以在类级别对该属性进行修饰。例如,在下面的代码中,每个操作方法的响应将被缓存30秒。

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; namespace Web.Controllers
{
[ResponseCache(Duration = )]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
} public IActionResult Privacy()
{
return View();
} public IActionResult GetValue()
{
return View();
}
}
}

还可以覆盖一个或多个方法的缓存行为。例如,在下面的代码中,类级别缓存行为是允许缓存响应30秒,但通过使用[ResponseCache] 装饰单个方法进行,可以更改方法响应的缓存。在这种情况下,GetValue()的响应永远不会被缓存,因为 [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]。

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; namespace Web.Controllers
{
[ResponseCache(Duration = )]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
} public IActionResult Privacy()
{
return View();
} [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult GetValue()
{
return View();
}
}
}

在上面的示例中,有两个主要的缓存行为,一个表示缓存,另一个表示无缓存。参数ResponseCachelocation,NoStore和Duration可以放入一个配置文件,并在.NET Core MVC中使用和重用这些属性。让我们假设应用程序中有一些缓存行为类型如下:

  • 默认——每个响应都缓存60秒
  • 从不——没有缓存任何响应。

可以将这两种行为转换为缓存配置文件。ResponseCache可以在如下所示的ConfigureServices(IServiceCollection服务)方法中的MVC中间件的StartUp.cs文件中设置:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; namespace Web
{
public class Startup
{
//....
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddMvc(options =>
{
options.CacheProfiles.Add("Default",
new CacheProfile()
{
Duration =
}); options.CacheProfiles.Add("Never",
new CacheProfile()
{
Location = ResponseCacheLocation.None,
NoStore = true
}); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
} ///.... }
}

在上面的代码中,两个缓存配置文件分别配置为“默认”和“从不”。“默认”缓存配置文件旨在将响应缓存60秒,如以下行所示:

{
Duration = 60
}

“从不”缓存配置文件旨在请求在以下情况下指定不应发生响应缓存:

{
Location = ResponseCacheLocation.None,
NoStore = true
}

现在缓存配置文件是在MVC上设置的,它们的操作方法可以通过指定配置文件的名称而不是通过提供缓存相关参数来开始使用它。例如,为了允许缓存,特性是[ResponseCache(CacheProfileName = "Default")]和不允许缓存,特性是 [ResponseCache(CacheProfileName = "Never")]。上面例子中的HomeController类,现在可以通过在HomeController类上使用装饰[ResponseCache(CacheProfileName = "Default")]和使用[ResponseCache(CacheProfileName = "Never")]特性的GetValue()方法来修改。

using Microsoft.AspNetCore.Mvc;

namespace Web.Controllers
{
[ResponseCache(CacheProfileName = "Default")]
public class HomeController : Controller
{ public HomeController()
{ } public IActionResult Index()
{
return View();
} public IActionResult Privacy()
{
return View();
} [ResponseCache(CacheProfileName = "Never")]
public IActionResult GetValue()
{
return View();
}
}
}

通过上述更改,home控制器内的所有方法将开始使用“默认”缓存配置文件,该配置文件基本上将缓存响应60秒。

在HomeController中我们有两个get方法。第一种方法是Index()返回产品列表,另一种方法Privacy()返回带有隐私相关内容的视图,最后GetValue()返回第三种方法,返回一些值。在这种情况下,我们还假设产品类型相对稳定,即它们的数据不会经常变化。但是,产品会根据库存而不断变化,因此不适合缓存。因为,如果我们在数据库中缓存产品和产品库存增加或减少,那么缓存的响应将是不正确的。

我们可以通过执行以下操作来验证缓存是否正常:

  • 在本地运行应用程序并转到index方法。
  • 打开PostMan或ARC以获取请求并查看响应标头。响应标头表示已使用缓存。
  • 现在注释掉相关的回复。
  • 在PostMan中重新创建请求并查看响应报头。

资源:
ASP.NET Core中的响应缓存。可在以下链接中获得:

Response caching in ASP.NET Core

英文原文地址:

https://www.codeproject.com/Articles/1280493/Handling-Caching-with-ResponseCache-attribute-in-t

原文链接

使用ASP.NET Core MVC应用程序中的ResponseCache属性处理缓存(转载)的更多相关文章

  1. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...

  2. ASP.NET Core MVC应用程序中的后台工作任务

    在应用程序的内存中缓存常见数据(如查找)可以显着提高您的MVC Web应用程序性能和响应时间.当然,这些数据必须定期刷新. 当然你可以使用任何方法来更新数据,例如Redis中就提供了设定缓存对象的生命 ...

  3. 创建ASP.NET Core MVC应用程序(6)-添加验证

    创建ASP.NET Core MVC应用程序(6)-添加验证 DRY原则 DRY("Don't Repeat Yourself")是MVC的设计原则之一.ASP.NET MVC鼓励 ...

  4. 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段

    创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...

  5. 创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图

    创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图 创建CRUD动作方法及视图 参照VS自带的基架(Scaffold)系统-MVC Controller with view ...

  6. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  7. 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL

    创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...

  8. 创建ASP.NET Core MVC应用程序(1)-添加Controller和View

    创建ASP.NET Core MVC应用程序(1)-添加Controller和View 参考文档:Getting started with ASP.NET Core MVC and Visual St ...

  9. Entity Framework Core系列之实战(ASP.NET Core MVC应用程序)

    本示例演示在ASP.NET 应用程序中使用EF CORE创建数据库并对其做基本的增删改查操作.当然我们默认你的机器上已经安装了.NET CORE SDK以及合适的IDE.本例使用的是Visual St ...

随机推荐

  1. Spring框架快速入门

    ssm框架是目前最流行的框架之一.他包括Spring,springMVC,mybatis.今天来简单介绍一下spring. 1.spring是什么? 答:spring是一个轻量级的框架. 2.两大核心 ...

  2. IntelliJ idea SpringBoot打war包

    简单易用的使用idea 将SpringBoot工程打war包的方法 pom.xml中添加标签 1. 声明打包格式 <packaging>war</packaging> 2.  ...

  3. Linux的IP详解

                        俗话说:黑发不知勤学早,白首方悔读书迟.                                                             ...

  4. Qemu-4.1 桥接网络设置

    参考: [qemu] qemu旧的net参数已经不再可用了,新的这样用. QEMU's new -nic command line option 用Qemu模拟vexpress-a9 --- 配置 q ...

  5. 使用docker搭建redis-cluster环境

    目录 基础环境信息 搭建步骤 搭建中遇到的问题 其他参考     临时接到一个测试任务,而测试需要用到redis-cluster环境,却没有现成的环境可用,于是只能自力更生搭建测试环境.一开始想采用在 ...

  6. linux常见性能分析工具

     vmstat    sar  (来源于sysstat工具包,需要yum  sysstat)iostat  (来源于sysstat工具包,需要yum  sysstat)free  -muptimene ...

  7. Android Studio总结

    课程背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,G ...

  8. Magic Master(2019年南昌网络赛E题+约瑟夫环)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...

  9. nginx 请求限制

    1.nginx 请求限制 1.连接频率限制 - limit_conn_module 2.请求频率限制 - limit_req_module 连接限制的语法 请求限制的语法 limit_conn_zon ...

  10. FileZilla 连接站点 编辑配置文件