Windows Phone アプリを作っていて時々困るの事のうちひとつに インターネットからの通信にキャッシュが効いて最新のデータを取ってきてくれないというのがあります。
例えば Web のデータを読んでくるこんなコードを 2 回実行してみても...
using (var req = new HttpClient()) using (var res = await req.GetAsync(new Uri("http://www.windowsphone.com/ja-JP/"))) { if (res.IsSuccessStatusCode) { var content = await res.Content.ReadAsStringAsync(); System.Diagnostics.Debug.WriteLine(content); } }
何故か通信は 1 回しか行われません。
しかも 2 回目以降の通信の結果は正常終了に見えます。
いや、true じゃねーよ。(まぁエラー返されても困るわけですが)
Phone 7 の頃は URL にダミーのパラメーターをつけたり Last-Modified ヘッダや ETag ヘッダをつけたりという小細工をしていましたね。
HttpBaseProtocolFilter クラスを使う
これが Phone 8.1 ...というか WinRT の Windows.Web.Http.HttpClient になると、HttpBaseProtocolFilter でキャッシュの扱いを指定することができます。
using (var filter = new HttpBaseProtocolFilter()) { filter.CacheControl.ReadBehavior = HttpCacheReadBehavior.MostRecent; using (var req = new HttpClient(filter)) using (var res = await req.GetAsync(new Uri("http://www.windowsphone.com/ja-JP/"))) { if (res.IsSuccessStatusCode) { var content = await res.Content.ReadAsStringAsync(); System.Diagnostics.Debug.WriteLine(content); } } }
これで実行する度にネットワークにアクセスするようになりました。