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?
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.
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.
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.
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:
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:
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)
:
With a refresh giving me a 304 Not Modified
:
Problem solved! Hope this helps someone else.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With