Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cache .NET Web API requests (& use w/ AngularJS $http)

I have a Web API written in ASP.NET that I'm consuming via AngularJS $http.

I have enabled caching in my AngularJS factory as follows but every request still returns a response of 200, never 200 (from cache) or 304 (and by every request I mean making the same web api request numerous times on the same page, revisiting a page I've already visited that contains a Web API request, refreshing said page 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;     }]); 

Am I missing something from the AngularJS side of things? Or is this a Web API problem. Or both?

like image 513
GFoley83 Avatar asked Jun 25 '13 00:06

GFoley83


People also ask

Is caching possible in Web API?

Caching is very common to make applications performant and scalable. If a result is already computed by the application, it is cached in a store so that next time when the same request comes, cached result can be fetched instead of processing the request again.

How do I cache data in .NET core?

ASP.NET Core supports several different caches. The simplest cache is based on the IMemoryCache. IMemoryCache represents a cache stored in the memory of the web server. Apps running on a server farm (multiple servers) should ensure sessions are sticky when using the in-memory cache.

Can API calls be cached?

You can enable API caching in Amazon API Gateway to cache your endpoint's responses. With caching, you can reduce the number of calls made to your endpoint and also improve the latency of requests to your API.


1 Answers

Turns out it was a Web API thing. I'd overlooked the fact that the response header clearly stated that caching was disabled.

Response as viewed in the Network tab of Google Chrome:

enter image description here

Upon further investigation (and as seen in the image above), caching is disabled in Web API controllers. Even the [OutputCache] attribute, which is used in regular MVC controllers, isn't supported.

Luckily I found this blog: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

which lead me to these two solutions:

  • ASP.NET Web API CacheOutput
  • CacheCow

I decided to go with CacheOutput as it lets me use attributes like:

[CacheOutputUntilToday] which supports server & client side caching.

Or if I wanted to just use client-side caching I can use something like:

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

Which seemed a little easier at first glance that CacheCow's approach. And easier to refactor out later if need be.

Now additional requests give me a 200 (from cache):

enter image description here

With a refresh giving me a 304 Not Modified:

enter image description here

Problem solved! Hope this helps someone else.

like image 93
GFoley83 Avatar answered Oct 13 '22 12:10

GFoley83