1.简单介绍
在应用程序开发过程中,缓存一直都是很重要的一个技术。一方面可以极大提高请求的响应速度,另一方面可以降低服务器端的访问压力。在客户端到服务器端的整个请求链路上都可以进行缓存的设定,比如浏览器端, DNS, Api Gateway, NLB(Network load balance), Server端。在.NET9中,微软还推出了HybridCache技术,将内存型缓存和分布式缓存进行配合使用。
当前这边尝试的是response header中的Cache control对于缓存的一个影响。
2. 具体说明
假定已经创建了一个Asp.Net Core Web Api
[Route("api/[controller]")]
[ApiController]
public class CacheController : ControllerBase
{
[HttpGet]
[Route("randomNumGenerate")]
public async Task<ActionResult<int>> GetRandomNumber()
{
var randomNum = Random.Shared.Next(100);
return randomNum;
}
}
在未配置Response Caching之前,每次访问web api都产生一个不同的数字。
2.1 客户端Response Caching
给CacheController中的Action添加ResponseCacheAttribute,如下图所示,
2.1.1 未设置Disable Cache
将浏览器配置中的Disable cache开关关闭(默认是关闭的)
访问web api,发现能访问成功同时Response headers中多了如下的header,
cache-control: public, max-age=20
表示配置的Response Caching开发发挥作用了
如果在20秒之内再次访问web api,则返回的是缓存的结果,
超过20秒,再次访问web api,则返回的不是缓存的结果了。
2.1.2 设置 Disable Cache
如果配置了客户端Response Caching之后,将浏览器中的 Disable cache开关打开,如下图所示,则发现缓存已经不管用了,所有的请求都将产生一个新的随机数。
同时在请求的Request Headers中多了一个Cache-Control no-cache的header,
当我们打开浏览器Disable Cache开关之后,浏览器本地会忽略通过Response Caching设定的Cache-Control public, max-age=20,这样客户端缓存就被禁用了。
2.2 服务端Response Caching
在program文件中加上Response Caching中间件,则Response Caching变成了服务器端响应缓存
app.UseResponseCaching();
2.2.1 未设置Disable Cache
将浏览器配置中的Disable cache开关关闭(默认是关闭的)
在20秒内,分别在Chrome浏览器和Edge浏览器中访问web api,发现返回的结果都是一样的,表示服务器端的响应缓存起作用了。
1) Chrome 浏览器查看结果,
2) Edge浏览器查看结果,
2.2.2 设置Disable Cache
如果配置了服务端Response Caching之后,将浏览器中的 Disable cache开关打开,如下图所示,
在20秒内,分别在Chrome浏览器和Edge浏览器中连续访问两次web api,发现每次产生的随机数字都是不同的。这表示服务端响应缓存已经不管用了,所有的请求都将产生一个新的随机数。
1) Chrome 浏览器查看结果,
2) Edge浏览器查看结果,
同时Request Headers中有Cache-Control no-cache
当我们打开浏览器Disable Cache开关之后,客户端缓存被禁用了,同时浏览器在向服务端发送请求的时候,Requst Headers中会加上Cache-Control: no-cache,通知服务端缓存也不需要了。
3.总结
本文简单介绍了一下客户端和服务端Response Caching的配置以及浏览器Disable Cache开关对缓存结果的影响。如果打开了Disable Cache开关,则Request Headers将增加Cache-Control no-cache header,客户端和服务端的响应缓存都被禁用了。
一般Response Caching中间件(服务端响应缓存)很少使用的,内存缓存和分布式缓存可能使用的更多一些,也可以使用.NET9推出的HybridCache技术。
本文如果哪里有错误,麻烦告之,谢谢谢谢!