如何缓存.NET Web API请求(并使用w/AngularJS $ http)

GFo*_*y83 26 c# caching asp.net-web-api angularjs

我有一个用ASP.NET编写的Web API,我通过AngularJS消费$http.

我已经在我的AngularJS工厂中启用了缓存,如下所示,但每个请求仍然返回响应200,从不200 (from cache)304(并且每个请求我的意思是在同一页面上多次发出相同的web api请求,重新访问我已经访问过的页面包含Web 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;
    }]);
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了AngularJS方面的一些东西?或者这是一个Web API问题.或两者?

GFo*_*y83 51

原来这是一个Web API的事情.我忽略了这样一个事实,即响应标题清楚地表明缓存已被禁用.

在Google Chrome的"网络"标签中查看的响应:

在此输入图像描述

经过进一步调查(如上图所示),Web API控制器中禁用了缓存.甚至[OutputCache]不支持在常规MVC控制器中使用的属性.

幸运的是我找到了这个博客:http: //www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

这引出了我这两个解决方案:

我决定使用CacheOutput,因为它允许我使用如下属性:

[CacheOutputUntilToday] 它支持服务器和客户端缓存.

或者,如果我只想使用客户端缓存,我可以使用类似的东西:

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

乍一看CacheCow的方法似乎有点容易.如果需要,以后更容易重构.

现在额外的请求给了我一个200 (from cache):

在此输入图像描述

刷新给我一个304 Not Modified:

在此输入图像描述

问题解决了!希望这有助于其他人.

  • 不要忘记,如果开发人员工具处于打开状态,则chrome具有破坏缓存的设置.这并不意味着这种情况,但是如果启用了你可以绊倒你,并且你正在观察期望看到你的缓存标题的网络选项卡! (3认同)
  • 默认的无缓存标头是ASP.NET或IIS,因为自托管Web API不会这样做. (2认同)
  • Web API是位于某些主机之上的框架:IIS/ASP.NET主机,WCF自主机或某些基于Owin的主机.默认情况下,您看到的缓存标题是由您正在使用的主机放在那里,而不是web api本身.并不是说它改变了你的任何东西,只是一个FYI. (2认同)