You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:18:01