摘要:这是用于 HttpClient 的客户端缓存模块。它会自动处理请求的缓存逻辑,包括检查是否命中缓存、发送条件请求等。
在开发中,HTTP 缓存是提高性能、减少服务器压力的重要手段。
CacheCow是一个专为 .NET 设计的 HTTP 缓存库。
支持 .NET Core 和 .NET Framework 4.52 及以上版本。
本文将介绍 CacheCow 的基本用法、核心概念和使用技巧。
可以通过 NuGet 来安装 CacheCow:
• Client 版本(用于客户端缓存)
Install-PackageCacheCow.Client• Server 版本(用于 ASP.NET MVC Core 或 Web API)
Install-PackageCacheCow.Server.Core.Mvc# 或者
Install-PackageCacheCow.Server.WebApi1. CacheCow.Client
这是用于 HttpClient 的客户端缓存模块。它会自动处理请求的缓存逻辑,包括检查是否命中缓存、发送条件请求等。
2. CacheCow.Server这是用于 ASP.NET Web API 或 MVC Core 的服务端缓存模块。它负责生成缓存指令,并处理客户端的条件请求。
3. 资源与表示• Resource(资源):比如/api/car/1是一个资源。
• Representation(表示):同一个资源可能有多种表示方式,例如 JSON 或 XML 格式。
4. 缓存控制头CacheCow 支持以下 HTTP 缓存相关的头部:
• Cache-Control
• Expires
• ETag
• Last-Modified
• Vary
这些头部决定了客户端如何缓存资源,以及何时重新验证。
客户端使用示例1. 创建带有缓存功能的 HttpClientvarclient = ClientExtensions.CreateClient;2. 发起请求并查看缓存状态conststringUrl ="https://code.jquery.com/jquery-3.3.1.slim.min.js";varresponse = client.GetAsync(Url).Result;
varcachedResponse = client.GetAsync(Url).Result;
Console.WriteLine(response.Headers.GetCacheCowHeader);
// 输出:2.0.0.0;did-not-exist=true
Console.WriteLine(cachedResponse.Headers.GetCacheCowHeader);
// 输出:2.0.0.0;did-not-exist=false;retrieved-from-cache=true
第一次请求从网络获取数据,第二次直接从缓存读取。
ASP.NET MVC Core 使用示例1. 注册服务publicvoidConfigureServices(IServiceCollection services){
services.AddHttpCachingMvc;// 启用 HTTP 缓存
}2. 在控制器中启用缓存[HttpGet]
[HttpCacheFactory(300)]// 设置缓存时间为 300 秒
publicIActionResultGet(intid)
{
returnOk(new{ Id = id, Name ="Test"});
}ASP.NET Web API 使用示例1. 添加 NuGet 包Install-PackageCacheCow.Server.WebApi2. 在控制器中启用缓存[HttpGet]
[HttpCache(DefaultExpirySeconds = 300)]
publicIHttpActionResultGet(intid)
{
returnOk(new{ Id = id, Name ="Test"});
}
头部名称
描述
x-cachecow-client客户端缓存的行为,如是否命中缓存、是否从网络加载等
x-cachecow-server服务端缓存的行为,如是否进行验证、是否短路响应等
例如,客户端返回:
2.0.0.0;did-not-exist=false;retrieved-from-cache=true说明该请求是从缓存中获取的。
自定义缓存存储默认情况下,CacheCow 使用内存作为缓存存储。如果需要更持久或分布式的缓存,可以使用 Redis 存储。
使用 Redis 存储varoptions =newRedisCacheStoreOptions("localhost");varcacheStore =newRedisCacheStore(options);
varhandler =newCachingHandler(cacheStore);自定义 ETag 生成
ETag 是缓存验证的核心机制。
默认情况下,CacheCow 会通过序列化对象生成 ETag。
对于大型对象,这可能会影响性能。
可以实现ITimedETagExtractor接口来自定义 ETag 生成逻辑。示例:基于 LastModifiedDate 生成 ETagpublicclassCarETagExtractor:ITimedETagExtractorCar{
publicTimedEntityTagHeaderValueExtract(Car car)
{
vartimestamp = BitConverter.GetBytes(car.LastModifiedDate.Ticks);
returnnewTimedEntityTagHeaderValue($"\"{Convert.ToBase64String(timestamp)}\"");
}
}
注册这个提取器后,CacheCow 将使用它来生成 ETag。
在 ASP.NET Core 中,你可以通过 DI 容器注册自定义的 ETag 提取器和服务查询器。
示例:注册 Car 的 ETag 提取器services.AddSingleton, CarETagExtractor>;然后在控制器中指定 ViewModel 类型:
[HttpGet][HttpCacheFactory(300, ViewModelType = typeof(Car))]
publicIActionResultGet(intid)
{
returnOk(GetCar(id));
}CacheCow 支持从appsettings.json文件中读取缓存配置。配置文件这段配置表示的Get方法的缓存时间为 10 秒。
CacheCow 是一个强大而灵活的 HTTP 缓存工具。
它简化了客户端和服务端的缓存实现。
无论你是开发 ASP.NET MVC 应用还是 Web API,都可以轻松集成 CacheCow 来提升性能。
赶快试试吧!🚀
GitHub 地址:https://github.com/aliostad/CacheCow
来源:opendotnet