2009-04-13 2 views
2

J'ai un client C# qui parle à un webservice cherrypy (http/rest). Le problème est que je ne peux pas activer à la fois la compression et la mise en cache en même temps.Comment mélanger la compression et la mise en cache dans HttpWebRequest?

request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

En laissant la ligne ci-dessus je reçois les en-têtes de mise en cache correcte (If-None-Math, If-Modified-Since) en commentant dehors moi obtient les en-têtes de compression (Accept-Codage du: gzip), mais pas les en-têtes de mise en cache. Cela me semble être un bug mais peut-être que je fais quelque chose de mal.

[code complet]

 public static string GET(string URL) 
    { 
     string JSON; 
     // Create the web request 
     HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; 
     HttpRequestCachePolicy cPolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Revalidate); 

     request.Accept = "application/json";    
     request.CachePolicy = cPolicy; 
     request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     request.Pipelined = false; 

     // Get response 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     {     
      // Get the response stream 
      StreamReader readerF = new StreamReader(response.GetResponseStream()); 

      JSON = readerF.ReadToEnd(); 
      // Console application output 
      //Console.WriteLine(JSON); 
      if (response.IsFromCache) 
       Console.WriteLine("Request not from cache"); 
     } 

     return JSON; 
    } 

Répondre

2

J'ai implémenté une solution de contournement, voir le code ci-dessous. J'ai jugé plus facile de gérer la compression que de gérer la mise en cache, j'ai donc implémenté moi-même la compression. Assez facile grâce à un article de blog: HttpWebRequest and GZip Http Responses; Je pense toujours que c'est un bug dans .net.

 public static string GET(string URL) 
    { 
     string JSON; 
     // Create the web request 
     HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; 
     HttpRequestCachePolicy cPolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Revalidate); 

     request.Accept = "application/json"; 
     request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); 
     request.CachePolicy = cPolicy; 
     request.Pipelined = false; 

     // Get response 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      //From http://www.west-wind.com/WebLog/posts/102969.aspx 
      Stream responseStream = responseStream = response.GetResponseStream(); 
      if (response.ContentEncoding.ToLower().Contains("gzip")) 
       responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
      else if (response.ContentEncoding.ToLower().Contains("deflate")) 
       responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 


      // Get the response stream 
      StreamReader readerF = new StreamReader(responseStream); 
      JSON = readerF.ReadToEnd(); 
     } 

     return JSON; 
    } 
0

Est-ce un effet secondaire de la politique? Que se passe-t-il si vous utilisez simplement la politique par défaut ou d'autres politiques?

L'autre option consiste à gérer vous-même le cache.

+0

J'ai essayé votre suggestion en définissant la stratégie de cache par défaut. Les mêmes résultats, semble être le réglage de la stratégie de désactivation de la compression. Je sais que je peux mettre en place un cache moi-même, mais ce n'est pas trivial trivial :-) – AngelBlaZe

Questions connexes