2010-08-04 115 views
1

我有一個傳統的C#Web服務(類繼承System.Web.Services.WebService),象這樣一系列的WebMethods的:如何從.net Web服務設置HTTP緩存控制?

[WebMethod, SoapHeader("header", Direction=SoapHeaderDirection.In)] 
[SoapDocumentMethod("http://www.myservices.com/Services/1.1#getMediaMetadata")] 
public MediaMetadata getMediaMetadata(string id) 
{ 
    return new MediaService().GetMetadata(id); 
} 

我試圖設置Cache-Control頭經由HttpResponse.Cache.SetMaxAge響應。執行服務產生一個默認的標題:

Cache-Control:private, max-age=0 

我有一個硬編碼的頭所代替標準Cache.SetMaxAge

HttpContext.Current.Response.AddHeader("Cache-Control", "private, max-age=" + (int)ttl.TotalSeconds); 

但仍然是Web服務器使用默認的Cache-Control響應。我懷疑在web方法執行後,ASP.NET web服務正在使用這種方法。以下建議使用WebMethod的CacheDuration屬性不適用於我的方案。

有什麼建議嗎?

+1

我現在懷疑問題在於客戶端發佈到web方法的事實,並且HTTP規範說Cache-Control在POST上是不相關的。顯然asp.net忽略了SetMaxAge的調用。 – 2010-08-31 21:16:46

回答

0
[WebMethod(CacheDuration=60), SoapHeader("header", Direction = SoapHeaderDirection.In)] 
SoapDocumentMethod("http://www.myservices.com/Services/1.1#getMediaMetadata")] 
public MediaMetadata getMediaMetadata(string id) 
{ 
    return new MediaService().GetMetadata(id); 
} 

將此屬性添加到您應該做的伎倆。

如果你特別想訪問上下文然後

Context.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(60)); 

您將可以安全地訪問上下文,除非它是空。一個簡單的檢查將爲你解決這個問題

+0

謝謝,我無法使用CacheDuration attrib,因爲值將根據請求而改變。我知道某些類型的webmethods(單向)可能沒有有效的HttpContext。問題在於是否有某種「官方」的方式來從web方法中引用它。 – 2010-08-04 17:48:20

+0

我不是100%肯定,但不是隻爲服務器緩存CacheDuration?如果我設置它,我仍然會得到「Cache-Control:no-cache Pragma:no-cache Expires:-1」,並且Cache.SetMaxAge不起作用... – Peter 2013-07-31 09:21:15