OutputCache / ResponseCache VaryByParam

时间:2016-01-27 03:00:39

标签: c# asp.net-web-api asp.net-caching asp.net-core-1.0

ResponseCache有点替代OutputCache;但是,我想做服务器端缓存以及每个参数输入。

根据一些答案herehere,我应该使用IMemoryCacheIDistributedCache来执行此操作。我对在参数不同的控制器上进行缓存特别感兴趣,以前在asp.net 4中使用OutputCacheVaryByParam进行缓存,如下所示:

[OutputCache(CacheProfile = "Medium", VaryByParam = "id", Location = OutputCacheLocation.Server)]
public ActionResult Index(long id) 
{ 
    ///...
}

我如何在asp.net核心中复制这个?

4 个答案:

答案 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。