ResponseCache
有点替代OutputCache
;但是,我想做服务器端缓存以及每个参数输入。
根据一些答案here和here,我应该使用IMemoryCache
或IDistributedCache
来执行此操作。我对在参数不同的控制器上进行缓存特别感兴趣,以前在asp.net 4中使用OutputCache
和VaryByParam
进行缓存,如下所示:
[OutputCache(CacheProfile = "Medium", VaryByParam = "id", Location = OutputCacheLocation.Server)]
public ActionResult Index(long id)
{
///...
}
我如何在asp.net核心中复制这个?
答案 0 :(得分:2)
首先确保您使用的是ASP.NET Core 1.1或更高版本。
然后在控制器方法上使用与此类似的代码:
[ResponseCache(Duration = 300, VaryByQueryKeys = new string[] { "date_ref" } )]
public IActionResult Quality(DateTime date_ref)
来源:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/middleware
答案 1 :(得分:1)
如果要通过控制器中所有请求中的所有请求查询参数更改缓存,则:
[ResponseCache(Duration = 20, VaryByQueryKeys = new[] { "*" })]
public class ActiveSectionController : ControllerBase
{
//...
}
答案 2 :(得分:1)
在asp.net核心中使用此
[ResponseCache(CacheProfileName = "TelegraphCache", VaryByQueryKeys = new[] { "id" })]
答案 3 :(得分:0)
对于寻求答案的人来说……毕竟IMemoryCache却不及过去的ActionFilterAttribute
,但具有更大的灵活性。
长话短说(对于.Net core 2.1主要由Microsoft docs +我的理解):
1-将services.AddMemoryCache();
服务添加到ConfigureServices
文件的Startup.cs
中。
2-将服务注入您的控制器:
public class HomeController : Controller
{
private IMemoryCache _cache;
public HomeController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
3-任意(为了防止输入错误)声明一个静态类,其中包含一堆密钥名称:
public static class CacheKeys
{
public static string SomeKey { get { return "someKey"; } }
public static string AnotherKey { get { return "anotherKey"; } }
... list could be goes on based on your needs ...
我宁愿声明一个enum
:
public enum CacheKeys { someKey, anotherKey, ...}
3-在action中玩它像这样的方法:
要获取缓存的值:_cache.TryGetValue(CacheKeys.SomeKey, out someValue)
或如果TryGetValue
失败,请重置值:
_cache.Set(CacheKeys.SomeKey,
newCachableValue,
new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(60)));
END。