ASP.NET Core 3.1自定义BlobStorage分布式响应缓存读写方法未触发问题
问题根因与解决方案
核心根因
ASP.NET Core 自带的AddResponseCaching/UseResponseCaching响应缓存中间件,默认使用内部独立的内存缓存实现,不会主动调用你注册的IDistributedCache服务,所以你自定义的Blob存储缓存的读写方法始终不会被触发。
修复方案
如果你需要将响应缓存的内容存储到自定义的Blob分布式缓存中,有两种成熟实现路径:
方案1:替换响应缓存中间件的默认存储实现
响应缓存中间件的存储逻辑依赖IResponseCache接口,默认注册的是内存实现,你可以自己实现该接口,替换默认服务即可让中间件直接使用你的Blob存储:
public class BlobResponseCache : IResponseCache { private readonly IDistributedCache _distributedCache; public BlobResponseCache(IDistributedCache distributedCache) { _distributedCache = distributedCache; } public IResponseCacheEntry Get(string key) { var data = _distributedCache.Get(key); if (data == null) return null; // 反序列化data为IResponseCacheEntry实现类即可,可使用System.Text.Json或者二进制序列化 return JsonSerializer.Deserialize<ResponseCacheEntry>(data); } public void Set(string key, IResponseCacheEntry entry, TimeSpan validFor) { var data = JsonSerializer.SerializeToUtf8Bytes(entry); _distributedCache.Set(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = validFor }); } }
然后在ConfigureServices中,注册完你的AddDistributedBlobStorageCache之后,添加如下代码替换默认的IResponseCache实现:
services.AddSingleton<IResponseCache, BlobResponseCache>();
方案2:改用输出缓存组件(适用于.NET 6+)
如果你的项目可以升级框架版本,.NET 6及以上自带的输出缓存组件原生支持自定义分布式缓存存储,直接配置即可,不需要自行实现适配层。
其他代码问题修复
你当前的DistributedBlobStorageCache.GetAsync方法逻辑不符合IDistributedCache的接口规范:当缓存不存在时应该返回null,而你当前返回的是Array.Empty<byte>(),会导致调用方误判缓存存在,需要修改为:
public async Task<byte[]> GetAsync(string key, CancellationToken token = new CancellationToken()) { var repos = CreateRepository(); var cacheItem = await repos.GetAsync(key, token); return cacheItem?.ContentBytes; // 不存在直接返回null即可 }
内容的提问来源于stack exchange,提问作者user2209131
相关产品推荐
相关产品推荐

