如何缓存 .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 容器