Asp.NET Core - ResponseCaching与Cache Control Header的一些尝试

发布于:2025-08-31 ⋅ 阅读:(20) ⋅ 点赞:(0)

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技术。

本文如果哪里有错误,麻烦告之,谢谢谢谢!


网站公告

今日签到

点亮在社区的每一天
去签到