ApiController的输出caching(MVC4 Web API)

我试图在Web API中caching一个ApiController方法的输出。

这是控制器代码:

public class TestController : ApiController { [OutputCache(Duration = 10, VaryByParam = "none", Location = OutputCacheLocation.Any)] public string Get() { return System.DateTime.Now.ToString(); } } 

NB我也试过控制器本身的OutputCache属性,以及它的几个参数组合。

该路由在Global.asax中注册:

 namespace WebApiTest { public class Global : HttpApplication { protected void Application_Start(object sender, EventArgs e) { RouteTable.Routes.MapHttpRoute("default", routeTemplate: "{controller}"); } } } 

我得到了一个成功的回应,但它没有被caching在任何地方:

 HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Type: application/xml; charset=utf-8 Expires: -1 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 18 Jul 2012 17:56:17 GMT Content-Length: 96 <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">18/07/2012 18:56:17</string> 

我无法在Web API中find输出caching的文档。

这是MVC4中的Web API的限制还是我做错了什么?

WebAPI没有任何对OutputCache属性的内置支持。 看看这篇文章 ,看看你可以自己实现这个function。

Aliostad的答案指出,Web APIclosurescaching,并且HttpControllerHandler的代码显示它在WHERE response.Headers.CacheControl为空。

为了让您的示例ApiController操作返回一个可caching的结果,您可以:

 using System.Net.Http; public class TestController : ApiController { public HttpResponseMessage Get() { var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(System.DateTime.Now.ToString()); response.Headers.CacheControl = new CacheControlHeaderValue(); response.Headers.CacheControl.MaxAge = new TimeSpan(0, 10, 0); // 10 min. or 600 sec. response.Headers.CacheControl.Public = true; return response; } } 

你会得到一个HTTP响应头像这样:

 Cache-Control: public, max-age=600 Content-Encoding: gzip Content-Type: text/plain; charset=utf-8 Date: Wed, 13 Mar 2013 21:06:10 GMT ... 

在过去的几个月中,我一直在为ASP.NET Web API开发HTTPcaching。 我已经为服务器端WebApiContrib做出了贡献,相关信息可以在我的博客上find。

最近我已经开始扩展这个工作,并在CacheCow库中添加客户端。 首先NuGet包已经发布了(感谢Tugberk )更多。 我将很快写一篇博文。 所以看空间。


但是为了回答你的问题,ASP.NET Web API默认closurescaching。 如果您希望caching响应,则需要将CacheControl标头添加到控制器中的响应中(事实上,最好放在与CacheCow中的CachingHandler类似的委派处理程序中)。

这段代码来自ASP.NET Web Stack源代码中的HttpControllerHandler

  CacheControlHeaderValue cacheControl = response.Headers.CacheControl; // TODO 335085: Consider this when coming up with our caching story if (cacheControl == null) { // DevDiv2 #332323. ASP.NET by default always emits a cache-control: private header. // However, we don't want requests to be cached by default. // If nobody set an explicit CacheControl then explicitly set to no-cache to override the // default behavior. This will cause the following response headers to be emitted: // Cache-Control: no-cache // Pragma: no-cache // Expires: -1 httpContextBase.Response.Cache.SetCacheability(HttpCacheability.NoCache); } 

你可以在一个普通的MVC控制器上使用它:

 [OutputCache(Duration = 10, VaryByParam = "none", Location = OutputCacheLocation.Any)] public string Get() { HttpContext.Current.Response.Cache.SetOmitVaryStar(true); return System.DateTime.Now.ToString(); } 

但是OutputCache属性在System.Web.Mvc命名空间中,并且在ApiController中不可用。