2013-01-21 126 views
0

我想在PracticeUpdate進行某些調用時控制前端的緩存。前端控制緩存

例如,當從javascript函數GetAllTags調用/api/GetAllTags時,我可以在Fiddler中看到緩存控制的返回標頭設置爲no-cache。是否可以在api中對此進行修改?

回答

2

您所需要做的就是獲取訪問請求的HttpResponseMessage對象。

var response = Request.CreateResponse(HttpStatusCode.OK); 

然後你就可以通過Headers訪問CacheControl對象,像這樣:

response.Headers.CacheControl = new CacheControlHeaderValue 
{ 
    Public = true, MaxAge = TimeSpan.FromMinutes(5) 
}; 

您可以通過詢問控制器Request屬性爲您創造的響應做這個控制器的動作裏面在這種情況下,您還可以使用ActionFilter,因此可以通過屬性將緩存應用於ApiController Action方法:

public class HttpCacheForMinutesAttribute : ActionFilterAttribute 
{ 
    private readonly int _duration; 

    public HttpCacheForMinutesAttribute(int duration) 
    { 
     _duration = duration; 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     base.OnActionExecuted(actionExecutedContext); 

     actionExecutedContext.Response.Headers.CacheControl = new CacheControlHeaderValue 
     { 
      Public = true, MaxAge = TimeSpan.FromMinutes(_duration) 
     }; 
    } 
} 
+0

ApiController沒有響應對象.. –

+0

你是@FilipW。修改了答案以反映如何訪問Response對象。 – Nick

+0

@Nick謝謝你的回覆。有什麼辦法可以從客戶端Java Script中設置它。我的意思是問,在瀏覽器中?所以,我可以在不重新部署應用程序的情況下將其設置爲客戶端。 – Nash

0

Web API的默認緩存策略不緩存。

您可以將緩存添加到每個操作中,或者僅使用一個框架爲您執行此操作,如CacheCow這是在客戶端(當您使用HttpClient時)和服務器的HTTP緩存的完整實現。