ASP.NET Core Web API中实现缓存

在.NET 6中,你可以使用几种方式来实现缓存,但最直接的方法之一是使用ResponseCaching中间件或自定义的ActionFilterAttribute(动作过滤器)。

1. 使用ResponseCaching中间件

ASP.NET Core 提供了一个内置的ResponseCaching中间件,它可以很容易地配置来缓存HTTP响应。这对于静态内容和一些动态内容(如基于查询参数的响应)非常有用。

首先,在Program.csStartup.cs中启用响应缓存中间件:

// 在Program.cs中(针对.NET 6)  
var builder = WebApplication.CreateBuilder(args);  
  
// 添加响应缓存服务  
builder.Services.AddResponseCaching();  
  
var app = builder.Build();  
  
// 使用响应缓存中间件  
if (!app.Environment.IsDevelopment())  
{  
    app.UseResponseCaching();  
}  
  
// 其余配置...  
  
app.Run();

然后,你可以通过属性或中间件配置来控制哪些响应应该被缓存。例如,在Controller或Action上使用[ResponseCache]属性:

[ApiController]  
[Route("[controller]")]  
public class ValuesController : ControllerBase  
{  
    [HttpGet]  
    [ResponseCache(Duration = 10, Location = ResponseCacheLocation.Client)]  
    public IActionResult Get()  
    {  
        // 假设这里是一些耗时的操作  
        return Ok(new string[] { "value1", "value2" });  
    }  
}

2. 自定义ActionFilterAttribute实现缓存

如果你需要更复杂的缓存逻辑(比如基于缓存键的动态内容),你可能需要实现一个自定义的ActionFilterAttribute

public class CacheFilterAttribute : ActionFilterAttribute  
{  
    private readonly IMemoryCache _cache;  
  
    public CacheFilterAttribute(IMemoryCache cache)  
    {  
        _cache = cache;  
    }  
  
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)  
    {  
        // 假设这里有一个简单的缓存键生成逻辑  
        var cacheKey = $"CacheFilter-{context.HttpContext.Request.Path}-{context.HttpContext.Request.QueryString}";  
  
        if (_cache.TryGetValue(cacheKey, out var cachedResponse))  
        {  
            // 缓存命中,返回缓存的内容  
            context.Result = new ObjectResult(cachedResponse)  
            {  
                StatusCode = StatusCodes.Status200OK  
            };  
        }  
        else  
        {  
            // 缓存未命中,继续执行Action  
            var resultContext = await next();  
  
            // 将结果缓存起来  
            _cache.Set(cacheKey, await resultContext.Result.ExecuteAsync(context.HttpContext.Response.Body), TimeSpan.FromMinutes(10));  
  
            // 注意:这里实际上并没有改变执行流程,只是为了演示如何缓存结果  
            // 正常情况下,你应该直接返回resultContext.Result  
        }  
    }  
}  
  
// 在Controller或Action上应用  
[ServiceFilter(typeof(CacheFilterAttribute))]

注意:上面的自定义缓存过滤器示例为了简化,直接在OnActionExecutionAsync中进行了缓存逻辑的处理,但这种方式实际上并不推荐用于生产环境,因为它会改变正常的请求处理流程(如直接返回缓存结果而不是执行Action)。通常,你可能需要在OnResultExecutionAsync中处理缓存逻辑,并在缓存未命中时调用next()来执行Action。

另外,请注意,当使用自定义过滤器进行缓存时,务必处理好并发和缓存失效等问题。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AitTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值