2012-06-19 25 views
0

我試圖實現與WCF一個REST Web服務,同時支持高速緩存和有條件的GET請求的ETag /條件GET。同時支持ASP.NET緩存和WCF WebHttp服務

我實現了按照MSDN: Caching Support for WCF Web HTTP Services該指令的基本緩存。這意味着要爲我的每個Web方法添加[AspNetCacheProfile("MyOutputCacheProfile")]屬性,並向web.config添加適當的條目。這似乎工作正常:當相同的參數傳遞給Web方法時,返回緩存的響應。

WebOperationContext.Current.OutgoingResponse.SetETag(myETag); 

那八九不離十工作:

然後,我通過計算ETag值以及設置在這樣的反應增加了有條件GET支持,我可以看到ETag頭中的響應,我第一次打電話網絡方法。

但問題出在這裏:下次我使用相同的參數調用Web方法時,會返回緩存的響應,並且緩存的響應不包含ETag標頭。 (如果我等到緩存過期,或禁用緩存完全,那麼ETag頭正確返回。)

那麼,有沒有什麼辦法讓緩存響應包括ETag值?


更新:一些更多的研究和實驗後,我發現,這樣做會導致包括在所有緩存的響應的ETag頭:

HttpContext.Current.Response.Cache.SetETag(myETag); 

如果我打電話說,我不要不需要撥打相關聯的WebOperationContext...SetETag()操作即可使所有內容都能正常工作。

這是正確的方式做到這一點?

回答

0

糾正我,如果我錯了。 RESTful服務更貼近HTTP和HTTP緩存說

緩存的HTTP目標/ 1.1是爲了消除需要在很多情況下發送 請求,並消除需要發送的全部 響應許多其他情況。前者減少了許多操作所需的網絡往返次數;我們使用 「過期」機制(見13.2節)。後者 減少網絡帶寬需求;我們使用「驗證」 機制(見13.3節)。

Asp.net緩存不屬於這個範疇中的任何一個(均未失效,也不驗證)。該緩存唯一的網絡服務器上完成和IIS而不是執行的方法中,將所存儲的響應。一些它如何不適合RESTful模型。

實現緩存,我們應該緩存控制標頭和ETag添加到響應頭,然後嘗試處理條件GET。請諮詢這個優秀的article