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

Posted

技术标签:

【中文标题】如何缓存 .NET Web API 请求(并使用 AngularJS $http)【英文标题】:How to cache .NET Web API requests (& use w/ AngularJS $http) 【发布时间】:2013-06-21 15:34:02 【问题描述】:

我有一个用 ASP.NET 编写的 Web API,我正在通过 AngularJS $http 使用它。

我已经在我的 AngularJS 工厂中启用了缓存,如下所示,但每个请求仍然返回 200 的响应,而不是 200 (from cache)304(每个请求我的意思是在同一页面,重新访问我已经访问过的包含 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;
    ]);

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

【问题讨论】:

【参考方案1】:

原来这是一个 Web API 的东西。我忽略了响应标头明确指出缓存已禁用这一事实。

在 Google Chrome 的“网络”选项卡中查看的响应:

在further investigation(如上图所示)上,Web API 控制器中的缓存被禁用。即使是在常规 MVC 控制器中使用的 [OutputCache] 属性也不支持。

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

这让我想到了这两个解决方案:

ASP.NET Web API CacheOutput CacheCow

我决定使用 CacheOutput,因为它让我可以使用以下属性:

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

或者如果我想just use client-side caching 我可以使用类似的东西:

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

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

现在其他请求给我一个200 (from cache)

刷新后给我304 Not Modified

问题解决了!希望这对其他人有帮助。

【讨论】:

默认的无缓存标头是 ASP.NET 或 IIS,因为自托管 Web API 不这样做。 对不起@DarrelMiller 不太清楚你的意思。您指的是哪种 Web API? Web API 是一个位于某些主机之上的框架:IIS/ASP.NET 主机、WCF 自主机或某些基于 Owin 的主机。您看到的默认插入的缓存标头是由您正在使用的主机放置的,而不是 Web api 本身。并不是说它对您有任何改变,只是仅供参考。 如果它在 IIS 下运行,那么它不是自托管的。自托管意味着在 Windows 控制台或 Windows 服务中。 不要忘记,chrome 有一个设置,如果开发人员工具打开,它会破坏缓存。并不意味着这里就是这种情况,但如果启用,并且您正在观察期望看到缓存标头的网络选项卡,可能会绊倒您!

以上是关于如何缓存 .NET Web API 请求(并使用 AngularJS $http)的主要内容,如果未能解决你的问题,请参考以下文章

防止在 ASP.NET MVC 中缓存 WEB API 数据

如何使用 Angular 取消 .Net Core Web API 请求?

基于 Servlet API 并部署到 Servlet 容器

如何使用 .NET 4.6.1 在 Insights 中记录每个 Web api 请求

Asp.Net中MVC缓存详解

推荐用于 Web API 的 ADAL 令牌缓存?