CacheCow:.NET 中的简单易用 HTTP 缓存

360影视 日韩动漫 2025-05-22 16:40 2

摘要:这是用于 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

相关推荐