Comportement de mise en cache System.Net.Http.HttpClient
Je suis en utilisant HttpClient la version 0.6.0 de NuGet.
J'ai le code C# suivant:
var client = new HttpClient(new WebRequestHandler() {
CachePolicy =
new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable)
});
client.GetAsync("http://myservice/asdf");
Le service (cette fois, CouchDB) renvoie une valeur ETag et le code d'état 200 OK. Il y est retourné une-tête Cache-Control avec la valeur must-revalidate
Mise à jour, voici les en-têtes de réponse de couchdb (prises à partir du débogueur visual studio):
Server: CouchDB/1.1.1 (Erlang OTP/R14B04)
Etag: "1-27964df653cea4316d0acbab10fd9c04"
Date: Fri, 09 Dec 2011 11:56:07 GMT
Cache-Control: must-revalidate
Prochaine fois que je fais exactement la même demande, HttpClient ne conditionnelle demande et obtient en retour "304 not Modified". Qui est droit.
Cependant, si je suis à l'aide de bas-niveau de la classe HttpWebRequest avec la même CachePolicy, la demande n'est même pas fait la deuxième fois. C'est la manière dont je HttpClient aussi se comporter.
Est le must-revalidate valeur d'en-tête ou pourquoi est-HttpClient se comporter différemment? Je voudrais faire une seule demande, et le reste à partir du cache sans la demande conditionnelle..
(Aussi, comme une note, lors du débogage, le code d'état de Réponse est indiqué que 200 OK, même si le service retourne 304 not Modified)
source d'informationauteur NiklasN
Vous devez vous connecter pour publier un commentaire.
À la fois les clients se comportent correctement.
must-revalidate
ne s'applique qu'à obsolète les réponses.Puisque vous n'avez pas explicitement d'expiration, les caches sont autorisés à utiliser des heuristiques pour déterminer la fraîcheur.
Puisque vous ne fournissez pas
Last-Modified
caches ne pas besoin d'avertir le client que l'heuristique a été utilisé.La réponse l'âge est calculé en fonction de
Date
de l'en-tête depuisAge
n'est pas présent.Si la réponse est encore frais en fonction heuristique de l'expiration, les caches peuvent utiliser la stockées réponse.
Une explication est que
HttpWebRequest
utilise des heuristiques et qu'il y avait un stockées réponse avec le code d'état 200 qui était encore frais.Pour répondre à ma propre question..
Selon http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4 je dirais que
un "Cache-Control: must-revalidate" sans expiration stipule que la ressource doit être validé à chaque requête.
Dans ce cas, cela signifie un conditionnel OBTENIR doit être effectué chaque fois que la ressource est faite. Donc dans ce cas le Système.Net.Http.HttpClient se comporte correctement et l'héritage (Http)WebRequest est en train de faire invalide comportement.