2016-09-05 99 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部分將被視爲緩存鍵。