2016-09-05 61 views
3
public class ValuesController : ApiController 
{ 
    [System.Web.Mvc.OutputCache(Duration = 3600)] 
    public int Get(int id) 
    { 
     return new Random().Next(); 
    } 
} 

由于缓存设置为1小时,我希望Web服务器为每个具有相同输入的请求始终返回相同的数字,而不会再次执行该方法。但事实并非如此,缓存属性不起作用。我做错了什么?缓存ASP.NET MVC Web API结果

我使用MVC5和我从VS2015和IIS Express进行测试。

+0

https://codewala.net/2015/05/25/outputcache-doesnt-work-with-web-api-why-a-solution/ –

回答

5

使用提琴手来看看HTTP响应 - 可能是响应头有:缓存控制:没有缓存

它`可能是一个好主意,用Strathweb.CacheOutput.WebApi2代替:如果您在使用则Web API 2

。然后,你的代码是:

public class ValuesController : ApiController 
{ 
    [CacheOutput(ClientTimeSpan = 3600, ServerTimeSpan = 3600)] 
    public int Get(int id) 
     { 
     return new Random().Next(); 
     } 
} 

其他你可以尝试使用自定义属性

public class CacheWebApiAttribute : ActionFilterAttribute 
    { 
     public int Duration { get; set; } 

     public override void OnActionExecuted(HttpActionExecutedContext filterContext) 
     { 
      filterContext.Response.Headers.CacheControl = new CacheControlHeaderValue() 
      { 
      MaxAge = TimeSpan.FromMinutes(Duration), 
      MustRevalidate = true, 
      Private = true 
      }; 
     } 
     } 

然后

public class ValuesController : ApiController 
{ 
    [CacheWebApi(Duration = 3600)] 
    public int Get(int id) 
     { 
     return new Random().Next(); 
     } 
} 
+0

我去自定义属性。工作得很好。感谢名单! – user256890

+0

很高兴我可以帮忙) – Vladimir

2

您需要使用的属性的VaryByParam部分 - 否则只能没有查询字符串的URL部分将被视为缓存键。