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 = 30)]public async Task<actionresult> Index(){return View();}[ResponseCache(Duration = 30)]public async Task<actionresult> Privacy(){return View();}[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]public async Task<actionresult> GetValue(){return View();}}
}

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

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;namespace Web.Controllers
{[ResponseCache(Duration = 30)]public class HomeController : Controller{public async Task<actionresult> Index(){return View();}public async Task<actionresult> Privacy(){return View();}public async Task<actionresult> 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 = 30)]public class HomeController : Controller{public async Task<actionresult> Index(){return View();}public async Task<actionresult> Privacy(){return View();}public async Task<actionresult> 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.AddTransient<iwebmanager webmanager="">();services.AddMvc( options =>{options.CacheProfiles.Add("Default",new CacheProfile(){Duration = 60});options.CacheProfiles.Add("Never",new CacheProfile(){Location = ResponseCacheLocation.None,NoStore = true});}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);}///....}
}

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

{Duration = 30
}

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

{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{private IWebManager _manager;public HomeController(IWebManager mgr){_manager = mgr;}public IActionResult Index(){return View();}public IActionResult Privacy(){return View();}[ResponseCache(CacheProfileName = "Never")]public IActionResult GetValue(){return Content(_manager.GetValue());}}
}

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

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

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

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

资源: ASP.NET Core中的响应缓存。可在以下网址中获得: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-2.2

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

使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存相关推荐

  1. 在Spring MVC Web应用程序中添加社交登录:集成测试

    我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但是它并不能真正告诉我们我们的应用程序是否正常运行. 这就是 ...

  2. 在Spring MVC Web应用程序中添加社交登录:单元测试

    Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...

  3. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

    如何使用recaptcha CAPTCHA是一个程序,可以生成人类可以通过但计算机程序" 不能 "通过的测试并对其进行评分. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用 ...

  4. 在Spring MVC Web应用程序中使用reCaptcha

    CAPTCHA是一种程序,可以生成人类可以通过的测试并对其进行评分,而计算机程序" 不能 "通过. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用户应在输入区域中书写文本. ...

  5. ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序

    本系列教程翻译自微软官方教程,官方教程地址:Get started with ASP.NET Core MVC | Microsoft Docs 本系列教程介绍了构建MVC Web应用程序的基础知识. ...

  6. 集成spring mvc_向Spring MVC Web应用程序添加社交登录:集成测试

    集成spring mvc 我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但它并不能真正告诉我们我们的应用程 ...

  7. 将社交登录添加到Spring MVC Web应用程序:配置

    过去,用户使用用户名和密码组合登录. 尽管如今有些人仍然偏爱传统方式,但越来越多的用户希望使用其社交媒体帐户登录. 这就是使Spring Social(及其子项目)成为Spring项目组合有用的补充的 ...

  8. DotNetCore Web应用程序中的Session管理

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者简介:Jon(Jonathan ...

  9. DotNetCore Web应用程序中的Cookie管理

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者简介:Jon(Jonathan ...

最新文章

  1. linux nfs共享文件
  2. Nature认定:中国高校论学术,中科大无悬念第一
  3. GitHub轻松阅读微服务实战项目流程详解【第一天:数据库表设计及其环境搭建、项目运行】
  4. Magento教程 22:如何确认订单报表?
  5. AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口
  6. 介绍 SQL Server 的安全配置
  7. 一个神秘 URL 酿大祸,差点让我背锅!
  8. Python中的分组函数(groupby、itertools)
  9. xsd文件转图片_原来华为手机能一键将图片转为PDF,实在太方便啦!你还不会吗?...
  10. 针对笔记本电源已接通未充电的提示怎么办
  11. Python编程输出所有的“水仙花数”
  12. WebService(一):工作原理
  13. 在线博客系统——注册
  14. 打开桌面计算机不显示文件夹,Win10系统怎么让此电脑中的文件夹不显示?
  15. Python 图片尺寸缩放的4种方式
  16. VTK笔记-图形相关-圆锥体-vtkConeSoure类
  17. Skippr – 轻量、快速的 jQuery 幻灯片插件
  18. 20211003:数字滤波器前置知识,sinc函数与Sa函数
  19. [ZT]SAP ECC5.0 Working Log TO 2008.5.26
  20. 奇虎360校园招聘2015笔试题目

热门文章

  1. android iot代码设计,一个简单好用的Android Tab 设计与实现
  2. java synoch 加锁_线程间通信 - HappyCowboy - 博客园
  3. java fastjson vector转为json_java对象与Json字符串之间的转化(fastjson)
  4. UI必不可少!手机计算器界面设计可学习案例
  5. PSD分层情人节海报模板,让人眼前一亮
  6. 干货素材|UI设计中的字体样式的应用
  7. UI设计师必备的网站推荐
  8. 只有1kb的清理软件_安卓手机总空间不足?试试这6个清理方法,瞬间多出几个G!...
  9. 4KB/2MB PAE分页模式下的线性地址翻译以及CR3
  10. linux-5.12-rc1-dontuse