在开发中,HTTP 缓存是提高性能、减少服务器压力的重要手段。
CacheCow 是一个专为 .NET 设计的 HTTP 缓存库。
支持 .NET Core 和 .NET Framework 4.52 及以上版本。
本文将介绍 CacheCow 的基本用法、核心概念和使用技巧。
📦 安装方法
可以通过 NuGet 来安装 CacheCow:
• Client 版本(用于客户端缓存)
Install-Package CacheCow.Client
• Server 版本(用于 ASP.NET MVC Core 或 Web API)
Install-Package CacheCow.Server.Core.Mvc # 或者 Install-Package CacheCow.Server.WebApi
🧰 核心概念
1. 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. 创建带有缓存功能的 HttpClient
var client = ClientExtensions.CreateClient();
2. 发起请求并查看缓存状态
const string Url = "https://code.jquery.com/jquery-3.3.1.slim.min.js";
var response = client.GetAsync(Url).Result;
var cachedResponse = 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. 注册服务
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpCachingMvc(); // 启用 HTTP 缓存
}
2. 在控制器中启用缓存
[HttpGet]
[HttpCacheFactory(300)] // 设置缓存时间为 300 秒
public IActionResult Get(int id)
{
return Ok(new { Id = id, Name = "Test" });
}
ASP.NET Web API 使用示例
1. 添加 NuGet 包
Install-Package CacheCow.Server.WebApi
2. 在控制器中启用缓存
[HttpGet]
[HttpCache(DefaultExpirySeconds = 300)]
public IHttpActionResult Get(int id)
{
return Ok(new { Id = id, Name = "Test" });
}
📊 缓存诊断信息
CacheCow 提供了两个诊断头部来帮助你了解缓存行为:
头部名称 | 描述 |
x-cachecow-client | 客户端缓存的行为,如是否命中缓存、是否从网络加载等 |
x-cachecow-server | 服务端缓存的行为,如是否进行验证、是否短路响应等 |
例如,客户端返回:
2.0.0.0;did-not-exist=false;retrieved-from-cache=true
说明该请求是从缓存中获取的。
⚙️ 高级配置
自定义缓存存储
默认情况下,CacheCow 使用内存作为缓存存储。
如果需要更持久或分布式的缓存,可以使用 Redis 存储。
使用 Redis 存储
var options = new RedisCacheStoreOptions("localhost");
var cacheStore = new RedisCacheStore(options);
var handler = new CachingHandler(cacheStore);
自定义 ETag 生成
ETag 是缓存验证的核心机制。
默认情况下,CacheCow 会通过序列化对象生成 ETag。
对于大型对象,这可能会影响性能。
可以实现 ITimedETagExtractor<T>
接口来自定义 ETag 生成逻辑。
示例:基于 LastModifiedDate 生成 ETag
public class CarETagExtractor : ITimedETagExtractor<Car>
{
public TimedEntityTagHeaderValue Extract(Car car)
{
var timestamp = BitConverter.GetBytes(car.LastModifiedDate.Ticks);
return new TimedEntityTagHeaderValue($"\"{Convert.ToBase64String(timestamp)}\"");
}
}
注册这个提取器后,CacheCow 将使用它来生成 ETag。
🔄 依赖注入支持
在 ASP.NET Core 中,你可以通过 DI 容器注册自定义的 ETag 提取器和服务查询器。
示例:注册 Car 的 ETag 提取器
services.AddSingleton<ITimedETagExtractor<Car>, CarETagExtractor>();
然后在控制器中指定 ViewModel 类型:
[HttpGet]
[HttpCacheFactory(300, ViewModelType = typeof(Car))]
public IActionResult Get(int id)
{
return Ok(GetCar(id));
}
🛠️ 配置管理
CacheCow 支持从 appsettings.json
文件中读取缓存配置。
配置文件
{
"CacheCow": {
"Car": {
"Get": {
"Expiry": "00:00:10"
}
}
}
}
这段配置表示 CarController
的 Get
方法的缓存时间为 10 秒。
📝 总结
CacheCow 是一个强大而灵活的 HTTP 缓存工具。
它简化了客户端和服务端的缓存实现。
无论你是开发 ASP.NET MVC 应用还是 Web API,都可以轻松集成 CacheCow 来提升性能。
赶快试试吧!🚀
GitHub 地址:https://github.com/aliostad/CacheCow
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏并分享给更多开发者!让我们一起学习,共同进步!