当前位置:首页 > Web开发 > 正文

谈谈ASP.NET Core中的ResponseCaching

2024-03-31 Web开发

前面的博客谈的大大都都是针对数据的缓存,今天我们来换换口味。来谈谈在ASP.NET Core中的ResponseCaching,与ResponseCaching关联密切的也就是常说的HTTP缓存。

在阅读本文内容之前,默认列位有HTTP缓存相关的根本,主要是Cache-Control相关的。

这里也贴两篇相关的博客:

透过浏览器看HTTP缓存

HTTP协议 (四) 缓存

回到正题,对付ASP.NET Core中的ResponseCaching,本文主要讲三个相关的小内容

客户端(浏览器)缓存

处事端缓存

静态文件缓存

客户端(浏览器)缓存

这里主要是通过设置HTTP的响应头来完成这件事的。要领主要有两种:

其一,直接用Response东西去设置。

这种方法也有两种写法,示例代码如下:

public IActionResult Index() { //直接一,简单粗暴,不要拼写错了就好~~ Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.CacheControl] = "public, max-age=600"; //直接二,略微优雅点 //Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue() //{ // Public = true, // MaxAge = TimeSpan.FromSeconds(600) //}; return View(); }

这两者效果是一样的,大抵如下:

技术图片

它们城市给响应头加上 Cache-Control: public, max-age=600,可能有人会问,加上这个有什么用?

那我们再来看张动图,应该会清晰不少。

技术图片

这里事先在代码里面设置了一个断点,正常情况下,只要请求这个action都是会进来的。

但是从上图可以发明,只是第一次才进了断点,其他直接打开的都没有进,而是直接返回功效给我们了,这也就说明缓存起感化了。

同样的,再来看看下面的图,from disk cache也足以说明,它并没有请求随处事器,而是直接从本地返回的功效。

技术图片

注:如果是刷新的话,还是会进断点的。这里需要区分好刷新,地点栏回车等行为。差别浏览器也有些许差异,这里可以用fiddler和postman来模拟。

在上面的做法中,我们将设置头部信息的代码和业务代码混在一起了,这显然不那么合适。

下面来看看第二种要领,也是对照保举的要领。

其二,用ResponseCacheAttribute去措置惩罚惩罚缓存相关的工作。

对付和上面的同等配置,只需要下面这样简单设置一个属性就可以了。

[ResponseCache(Duration = 600)] public IActionResult Index() { return View(); }

效果和上面是一致的!措置惩罚惩罚起来是不是简单多了。

既然这两种方法都能完成一样的效果,,那么ResponseCache这个Attribute素质也是往响应头写了相应的值。

但是我们知道,纯粹的Attribute并不能完成这一操纵,此中必定另有玄机!

翻了一下源码,可以看到它实现了IFilterFactory这个关键的接口。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class ResponseCacheAttribute : Attribute, IFilterFactory, IOrderedFilter { public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) { //.. return new ResponseCacheFilter(new CacheProfile { Duration = _duration, Location = _location, NoStore = _noStore, VaryByHeader = VaryByHeader, VaryByQueryKeys = VaryByQueryKeys, }); } }

也就是说,真正起感化的是ResponseCacheFilter这个Filter,核心代码如下:

public void OnActionExecuting(ActionExecutingContext context) { var headers = context.HttpContext.Response.Headers; // Clear all headers headers.Remove(HeaderNames.Vary); headers.Remove(HeaderNames.CacheControl); headers.Remove(HeaderNames.Pragma); if (!string.IsNullOrEmpty(VaryByHeader)) { headers[HeaderNames.Vary] = VaryByHeader; } if (NoStore) { headers[HeaderNames.CacheControl] = "no-store"; // Cache-control: no-store, no-cache is valid. if (Location == ResponseCacheLocation.None) { headers.AppendCommaSeparatedValues(HeaderNames.CacheControl, "no-cache"); headers[HeaderNames.Pragma] = "no-cache"; } } else { headers[HeaderNames.CacheControl] = cacheControlValue; } }

它的素质自然就是给响应头部写了一些对象。

通过上面的例子已经知道了ResponseCacheAttribute运作的基来源根底理,下面再来看看如何配置出其他差此外效果。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31476.html