2011-06-08 210 views
4

我有一個WCF Web服務返回JSON。WCF REST JSON服務緩存

[OperationContract] 
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
Stream GetStuff(int arg); 

而且我用這個方法的對象圖轉換成JSON:

private static Stream ToJson(object obj) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    string json = serializer.Serialize(obj); 

    if (WebOperationContext.Current != null) 
    { 
     OutgoingWebResponseContext outgoingResponse = WebOperationContext.Current.OutgoingResponse; 

     outgoingResponse.ContentType = "application/json; charset=utf-8"; 
     outgoingResponse.Headers.Add(HttpResponseHeader.CacheControl, "max-age=604800"); // one week 
     outgoingResponse.LastModified = DateTime.Now; 
    } 

    return new MemoryStream(Encoding.UTF8.GetBytes(json)); 
} 

我想在瀏覽器中緩存的反應,但瀏覽器仍然產生If-Modified-Since電話到與304 Not Modified重播的服務器。我希望瀏覽器緩存並使用響應,而不必每次都撥打If-Modified-Since調用服務器。

我注意到,即使我在代碼中指定Cache-Control "max-age=604800",通過WCF發送的響應報頭是Cache-Control no-cache,max-age=604800。爲什麼WCF添加「無緩存」部分以及如何阻止添加它?

回答

2

嘗試將Cache-Control設置爲「public,max-age = ...」。這可能會阻止WCF應用默認緩存策略標頭。

此外,還有所謂的「遠期過期頭」。對於長時間的高速緩存,我使用Expires標題而不是Cache-Control:'max-age = ...'並將Cache-Control保留爲「public」。

+0

謝謝,這解決了我的問題:HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(14)); HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public); 我不確定HttpContext.Current在WCF Web服務中是否可用 – 2011-06-09 13:57:32

+3

僅當您在aspNet兼容模式下運行時纔可用。 – 2012-02-06 14:05:15