Cómo almacenar en caché las solicitudes de la API web .NET (y usar con AngularJS $ http)

Tengo una API web escrita en ASP.NET que estoy consumiendo a través de AngularJS $http .

He habilitado el almacenamiento en caché en mi fábrica de AngularJS de la siguiente manera, pero cada solicitud todavía devuelve una respuesta de 200 , nunca 200 (from cache) o 304 (y por cada solicitud me refiero a hacer la misma solicitud de API web varias veces en la misma página, revisando una Página que ya he visitado que contiene una solicitud de API web, actualizando dicha página, etc.).

 angular.module('mapModule') .factory('GoogleMapService', ['$http', function ($http) { var googleMapService = { getTags: function () { // $http returns a promise, which has a 'then' function, which also returns a promise return $http({ cache: true, dataType: 'json', url: '/api/map/GetTags', method: 'GET', data: '' }) .then(function (response) { return response.data; }); }; return googleMapService; }]); 

¿Me estoy perdiendo algo del lado de AngularJS de las cosas? O es este un problema de la API web. ¿O ambos?

Resulta que era una cosa de la API web. Había pasado por alto el hecho de que el encabezado de respuesta indicaba claramente que el almacenamiento en caché estaba deshabilitado.

Respuesta como se ve en la pestaña Red de Google Chrome:

introduzca la descripción de la imagen aquí

Tras una investigación adicional (y como se ve en la imagen de arriba), el almacenamiento en caché se desactiva en los controladores de API web. Incluso el atributo [OutputCache] , que se usa en los controladores MVC normales, no es compatible.

Por suerte encontré este blog: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

que me llevan a estas dos soluciones:

  • API Web ASP.NET CacheOutput
  • Caché

Decidí usar CacheOutput porque me permite usar atributos como:

[CacheOutputUntilToday] que admite el almacenamiento en caché del lado del cliente y del servidor.

O si solo quisiera usar el caché del lado del cliente, puedo usar algo como:

[CacheOutput(ClientTimeSpan = 100, ServerTimeSpan = 0)]

Lo que parecía un poco más fácil a primera vista que el enfoque de CacheCow. Y más fácil de refactorizar más tarde si es necesario.

Ahora las solicitudes adicionales me dan un 200 (from cache) :

introduzca la descripción de la imagen aquí

Con una actualización dándome un 304 Not Modified :

introduzca la descripción de la imagen aquí

¡Problema resuelto! Espero que esto ayude a alguien más.