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可以在如下所示的ConfigureServicesIServiceCollection服务)方法中的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. LaTeX公式手册(全网最全)

    参考维基百科的数学公式教程 参考Cmd Markdown 公式指导手册 本文为 MathJax 在 Markdown 环境下的语法指引. 如何插入公式 \(\LaTeX\) 的数学公式有两种:行中公式 ...

  2. electron/nodejs实现调用golang函数

    https://www.jianshu.com/p/a3be0d206d4c 思路 golang 支持编译成c shared library, 也就是系统中常见的.so(windows下是dll)后缀 ...

  3. IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL\test1'.

    报错: Cannot open database "test4" requested by the login. The login failed. Login failed fo ...

  4. 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(配置MQTT的SSL证书,验证安全通信)

    4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书) 前面的准备工作终于完了 复制这两个证书 放到云端MQTT的这个位置,其实放哪里都可以 ...

  5. centos 升级openSSH7.81

    1.下载相关依赖包 [root@Log ~]# yum install -y gcc openssl-devel pam-devel rpm-build 2.下载安装包 wget http://ftp ...

  6. JS中 (function(){...})()立即执行函数

    (function(){...})() (function(){...}()) 这是两种js立即执行函数的常见写法. 基本概念: 函数声明:function fname(){...}; 使用funct ...

  7. CF852A Digits

    CF852A Digits 隔壁yijian大佬写出了正解.那我就写一个随机化大法吧? 我们先考虑一种错误的贪心,每个数字分成一位,使其分割后数字和最小.虽然这样是错的,但是我们发现错误的概率很小,所 ...

  8. concurrent (二)AQS

    参考文档: https://www.cnblogs.com/waterystone/p/4920797.html

  9. NamedParameterJdbcTemple与RowMapper实现

    NamedParameterJdbcTemplate和JdbcTemplate功能基本差不多. 1.配置 db.properties 1 jdbc.user=root 2 jdbc.password= ...

  10. .net core 运行不需命令行

    1.问题情景: 需要保证已安装.net core SDK,并且命令提示符下运行“dotnet --version”,有反应. 如果之前运行良好,现在却不行了,查看安装程序中存在.net core SD ...