Ответ 1
К сожалению, кеширование не встроено в веб-API ASP.NET.
Отметьте это, чтобы вы на ходу: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/
Обновленный ресурс здесь: https://github.com/filipw/AspNetWebApi-OutputCache
Я использую 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 требует времени, как я могу заставить это работать?
К сожалению, кеширование не встроено в веб-API ASP.NET.
Отметьте это, чтобы вы на ходу: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/
Обновленный ресурс здесь: https://github.com/filipw/AspNetWebApi-OutputCache
Добавьте ссылку на 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));
Как уже упоминалось OakNinja, кэширование вывода через атрибуты [OutputCache]
в настоящее время не поддерживается веб-API ASP.NET.
Однако существует несколько версий с открытым исходным кодом, заполняющих пробел:
Небольшая библиотека, в которой перечислены параметры кэширования, похожие на MVC "OutputCacheAttribute", на действия веб-API.
Github: https://github.com/filipw/Strathweb.CacheOutput
Лицензия: Apache v2
Реализация кэширования HTTP в веб-API ASP.NET для клиентской и серверной сторон.
Github: https://github.com/aliostad/CacheCow
Лицензия: MIT
Примечание. В соответствии с проектами README библиотека не поддерживает маршрутизацию атрибутов:
В настоящее время атрибут атрибута CacheCow не работает с атрибутом Маршрутизация. И я лично думаю, что вы не должны использовать атрибут Маршрутизация... (Источник: https://github.com/aliostad/CacheCow/blob/master/README.md)
Есть хороший пост в блоге Скотта Хансельмана, охватывающий оба набора функций.
[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();
}
Теперь вы можете использовать System.Runtime.Cache к тому же без сторонних нюгетов.
Более подробная информация на http://rajeevdotnet.blogspot.com/2018/05/aspnet-web-api-caching.html