route parameter maphttproute fromuri attribute c# asp.net-web-api http-caching

c# - maphttproute - web api request parameters



¿Cómo usar el almacenamiento en caché en ASP.NET Web API? (4)

Agregue una referencia a System.Runtime.Caching en su proyecto. Agregue una clase de ayuda:

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); } } }

Luego, desde su código, obtenga o configure objetos en el caché:

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

y

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

Estoy usando ASP.NET MVC 4 con API WEB

Tengo la siguiente acción, en la acción que se muestra a continuación, mi método de servicio realiza una llamada de DoMagic() de DoMagic() al método DoMagic() y devuelve un valor entero que estoy usando en cada página, esta acción se realiza mediante una llamada ajax.

Debajo está mi acción de la API WEB:

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

Mi pregunta: He intentado usar [OutputCache(Duration = 86400, VaryByParam = "none")] y exceptué que solo la primera vez que se haga la llamada de db y la próxima solicitud posterior a esta acción me devolverá el valor almacenado en caché, pero esto no está ocurriendo.

Una vez más se realiza una llamada db, la llamada db lleva tiempo ¿cómo hago para que funcione?


Como ya mencionó OakNinja, el almacenamiento en caché de salida a través de los atributos [OutputCache] actualmente no es compatible con ASP.NET Web API.

Sin embargo, hay algunas implementaciones de código abierto que cubren el vacío:

Strathweb.CacheOutput

Una pequeña biblioteca que trae opciones de almacenamiento en caché, similar a "OutputCacheAttribute" de MVC, a las acciones de la API web.

Github: https://github.com/filipw/Strathweb.CacheOutput
Licencia: Apache v2

CacheCow

Una implementación de HTTP Caching en ASP.NET Web API para el lado del cliente y el lado del servidor.

Github: https://github.com/aliostad/CacheCow
Licencia: MIT

Nota: Según los proyectos README, la biblioteca no admite el enrutamiento de atributos :

Actualmente, la configuración de atributos de CacheCow no funciona con el Enrutamiento de atributos. Y personalmente creo que no deberías usar Attribute Routing ... (Fuente: https://github.com/aliostad/CacheCow/blob/master/README.md )

Hay una buena publicación de blog de Scott Hanselmann que cubre ambos conjuntos de características.



[ResponseCache] ahora es compatible con ASP.NET Core

Las características pueden parecer idénticas a [OutputCache] pero [ResponseCache] es solo para el lado del cliente.

El almacenamiento en caché de respuestas agrega encabezados relacionados con la caché a las respuestas. Estos encabezados especifican cómo desea que el cliente, el proxy y el middleware guarden en caché las respuestas.

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

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