kazuakix の日記

Windows Phone とか好きです

HttpClient でキャッシュを効かせない

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 回しか行われません。

f:id:kazuakix:20141003004238j:plain

しかも 2 回目以降の通信の結果は正常終了に見えます。

f:id:kazuakix:20141003004239j:plain

いや、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);
        }
    }
}


これで実行する度にネットワークにアクセスするようになりました。

f:id:kazuakix:20141003004240j:plain