Подтвердить что ты не робот

Как использовать кеширование в ASP.NET Web API?

Я использую ASP.NET MVC 4 с WEB API

У меня есть следующее действие: в действии, показанном ниже, мой метод службы вызывает вызов db для метода DoMagic() и возвращает целочисленное значение, которое я затем использую на каждой странице, это действие вызывается с помощью вызова ajax.

Ниже приведено действие WEB API:

[OutputCache(Duration = 86400, VaryByParam = "none")]
[ActionName("GetMyMagicNumber")]
public int GetMyMagicNumber()
{
    if (WebSecurity.IsAuthenticated)
    {
        var revenue = _magicService.DoMagic();
        return revenue;
    }
    return 0;
}

Мой вопрос: я попробовал использовать [OutputCache(Duration = 86400, VaryByParam = "none")], и я исключил, что только в первый раз, когда вызов db будет сделан, а следующий последующий запрос к этому действию вернет мне кешированное значение, но этого не происходит.

Вызывается вызов db, вызов db требует времени, как я могу заставить это работать?

4b9b3361

Ответ 2

Добавьте ссылку на System.Runtime.Caching в своем проекте. Добавить класс-помощник:

using System;
using System.Runtime.Caching;


public static class MemoryCacher
{
    public static object GetValue(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Get(key);
    }

    public static bool Add(string key, object value, DateTimeOffset absExpiration)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Add(key, value, absExpiration);
    }

    public static  void Delete(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        if (memoryCache.Contains(key))
        {
            memoryCache.Remove(key);
        }
    }
}

Затем из вашего кода можно получить или установить объекты в кеше:

list = (List <ChapterEx>)MemoryCacher.GetValue("CacheItem1");

и

MemoryCacher.Add("CacheItem1", list, DateTimeOffset.UtcNow.AddYears(1));

Ответ 3

Как уже упоминалось OakNinja, кэширование вывода через атрибуты [OutputCache] в настоящее время не поддерживается веб-API ASP.NET.

Однако существует несколько версий с открытым исходным кодом, заполняющих пробел:

Strathweb.CacheOutput

Небольшая библиотека, в которой перечислены параметры кэширования, похожие на MVC "OutputCacheAttribute", на действия веб-API.

Github: https://github.com/filipw/Strathweb.CacheOutput
Лицензия: Apache v2

CacheCow

Реализация кэширования HTTP в веб-API ASP.NET для клиентской и серверной сторон.

Github: https://github.com/aliostad/CacheCow
Лицензия: MIT

Примечание. В соответствии с проектами README библиотека не поддерживает маршрутизацию атрибутов:

В настоящее время атрибут атрибута CacheCow не работает с атрибутом Маршрутизация. И я лично думаю, что вы не должны использовать атрибут Маршрутизация... (Источник: https://github.com/aliostad/CacheCow/blob/master/README.md)

Есть хороший пост в блоге Скотта Хансельмана, охватывающий оба набора функций.

Ответ 4

[ResponseCache] теперь поддерживается в ASP.NET Core

Функции могут выглядеть идентично [OutputCache], но [ResponseCache] относится только к стороне клиента.

Кэширование ответов добавляет к ответам заголовки, связанные с кешем. Эти заголовки указывают, как вы хотите, чтобы клиент, прокси и промежуточное ПО кэшировали ответы.

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response

[ResponseCache(Duration = 3600)]
[HttpGet]
public IEnumerable<Product> Get()
{
  return _service.GetAll();
}