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中不可用。
- 在ASP.NET WebApi中testing路由configuration
- 使用<meta>标签在所有浏览器中closurescaching?
- 如何使用System.Net.HttpClient发布一个复杂的types?
- 检测到entity framework自我引用循环
- Json.Net中的PreserveReferencesHandling和ReferenceLoopHandling有什么区别?
- 在ApiController操作中获取当前用户,而不传递用户ID作为参数
- 将Json反序列化为Asp.Net Web API中的派生types
- DataAnnotation为必需属性
- ASP.NET WebApi与MVC?