System.Net.Http.HttpClient 的 Cache 機制
這個 namespace 已經內建在新版的 desktop .net ,微軟也有另外出一個 PCL 的 Http 的 NuGet package
是一個被 System.Net.Http.HttpClient 婊到的Fu,我們中台的Web API雖然走Get但是參數是帶在Header裡面的
今天幫一個Web API做了一個自制的Cache機制,讓它發第二次的時候可以減少要求的資料量,寫好後開心的開始測試,
結果發現奇怪怎麼第二次送Request後我明明給的參數不同了,卻回來的跟第一次一樣的資料?!
我還測試了好幾次,有一種鬼打牆的Fu… 囧
第一時間當然是先懷疑中台的問題XD 不過怪怪的,這樣其他人在開發上應該會馬上遇到問題才是?!用了Http的測試工具測試我使用的情境後,才確定中台應該是沒問題
好吧!看來應該就是我這邊的問題了!看看程式碼好像應該是沒問題啊!?因為都有把Request的時候的參數output出來也確定應該是無誤,所 以就乾脆下載了WireShark來確定是不是真的送出去的HttpRequest裡面的東西錯了,裝完一錄封包馬上就發現問題,我靠~我發了兩次 Request為什麼WireShark裡面只錄到了一次????第一次以為是WireShark故障之類的,不信邪再試了一次,耶嘿~是真的只會發一次 咧!! 囧rz
所以兇手很明顯就是Cache問題啦!!喵的咧~害我今天以為看到鬼了…
其實一開始有想到是不是傳說中同一個Url會有Cache問題的BugFeature,因為HttpClient是.NET新的,以為不會有這問題的,但看來是有的Orz
OK~ 解法很簡單~ 有兩種
不過因為我是在PCL,裡面列的第一種解法是要在 Windows.Web.Http.Filters.HttpBaseProtocolFilter 是沒辦法在 PCL用到的,所以用第二種解法,而且我覺得第二種才是比較「通用」的解法,解法更簡單,就是加上
Cache-Control: no-cache
就搞定收工了。
以上是今天鬼打牆的經驗 >"<
雖然這邊我遇到的是Bug,但其實換個角度來想,對我們App會用到一些變動性不大的資料,這的確是一個不錯的Feature?!