2013-06-25 2 views
24

У меня есть веб-API, написанный на ASP.NET, который я потребляю через AngularJS $http.

Я включил кэширование в моем AngularJS заводе следующим образом, но каждый запрос по-прежнему возвращает ответ 200, никогда 200 (from cache) или 304 (и каждый запрос я имею в виду сделать такой же запрос АНИ веб-много раз на той же странице, пересматривают страница, которую я уже посетил, которая содержит запрос веб-API, обновление указанной страницы и т. д.).

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

Я пропустил что-то из стороны AngularJS? Или это проблема веб-API. Или оба?

ответ

49

Оказывается, это был веб-интерфейс API. Я бы упустил тот факт, что заголовок ответа четко заявил, что кеширование отключено.

Ответ, как показано на вкладке Сеть Google Chrome:

enter image description here

После further investigation (и, как видно на картинке выше), кэширование отключено в контроллерах Web API. Даже атрибут [OutputCache], который используется в обычных контроллерах MVC, не поддерживается.

К счастью, я нашел этот блог: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

, который привел меня к этим двум решениям:

Я решил пойти с CacheOutput как это позволяет я использую такие атрибуты, как:

[CacheOutputUntilToday], который поддерживает сервер & клиентское кэширование.

Или, если я хотел just use client-side caching я могу использовать что-то вроде:

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

который, казалось, немного легче, на первый взгляд, что подход CacheCow в. И проще реорганизовать позже, если потребуется.

Теперь дополнительные запросы дают мне 200 (from cache):

enter image description here

С обновлением дает мне 304 Not Modified:

enter image description here

Проблема решена! Надеюсь, это помогает кому-то другому.

+2

По умолчанию заголовки без кэша являются либо ASP.NET, либо IIS, потому что сам хостинг Web API этого не делает. –

+0

Извините @ DarrelMiller не слишком уверен, что вы имеете в виду. О каком веб-интерфейсе вы имеете в виду? – GFoley83

+2

Веб-интерфейс API - это среда, которая находится поверх некоторого хоста: либо IIS/ASP.NET, WCF Self-Host или некоторый хост на основе Owin. Заголовки кэширования, которые вы видите вставленными по умолчанию, помещаются туда хостом, который вы используете, а не самим веб-апи. Не то, чтобы это ничего не изменило для вас, просто FYI. –