新しい .NET 4.5 HttpClient クラスは Web 要求の送信に便利なので、古い HttpWebRequest および関連クラスの代わりに使用しようとしています。
解凍、キャッシングなど、以前と同じようにすべてのことを実行できます...
しかし、完了したリクエストがキャッシュによって満たされたかどうかはどうすればわかりますか?
これは以前は可能でした:
using (var resp = request.GetResponse())
using (var rs = resp.GetResponseStream())
{
if (!resp.IsFromCache)
{
//do something
}
}
ここでそのチェックをどこに追加できますか?
HttpClient client = new HttpClient(
new WebRequestHandler
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.CacheIfAvailable),
UseDefaultCredentials = true,
PreAuthenticate = true
});
var data = await client.GetByteArrayAsync(uri);
//did that come from the cache?
return data;
「キャッシュからのものかどうかを知る必要があるのはなぜですか?」...まあ、たまたまサーバーと通信したかどうか知りたいのですが、もしそうなら、セッションのキープアライブタイマーを延長します...しかし、キャッシュからそれを取得したばかりで、通信さえしなかった場合サーバーにアクセスしてください。もっと早くセッション キープ アライブ リクエストを送信する必要があるかもしれません...このサーバーのセッションの作成には少なくとも数秒かかるため、それを避けたいと考えています。
HttpClient でより断片的なメソッドを使用すると、応答を調査してステータス コードとヘッダーを探す余地が増えます。
var resp = await client.GetAsync(uri);
resp.EnsureSuccessStatusCode();
//can look at status codes, headers etc here
return await resp.Content.ReadAsByteArrayAsync();
キャッシュされているかどうかに関係なく、ステータス コードは 200 のように見えます...ヘッダーにいくつか興味深いものがありますが、それらすべてをどのように解釈するかはわかりません。
たとえばresp.Headers.Date
、応答がキャッシュされた日付のように見えるので、十分に過去 (数秒以上?) であれば、キャッシュされているかどうかがわかります。しかし、そのような考え方がどれほど信頼できるかはわかりません...