2009-04-13 5 views
2

Ich habe einen C# -Client, der mit einem cherrypy (http/rest) Webservice kommuniziert. Das Problem ist, dass ich nicht gleichzeitig Komprimierung und Caching aktivieren kann.Wie Komprimierung und Caching in HttpWebRequest mischen?

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

Durch die obige Zeile Weglassen bekomme ich die richtigen Caching-Header (If-None-Math, If-Modified-Since), während es auszukommen wird mir die Kompression Header (Accept-Encodig: gzip), aber nicht die Caching-Header. Es scheint mir wie ein Käfer, aber vielleicht mache ich etwas falsch.

[vollständiger Code]

 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; 
    } 

Antwort

2

Ich habe eine Problemumgehung implementiert, siehe Code unten. Ich empfand die Handhabung der Komprimierung als einfacher als die Handhabung des Caching, also habe ich den Komprimierungsteil selbst implementiert. Ganz einfach dank eines Blogposts: HttpWebRequest and GZip Http Responses; Ich denke immer noch, dass dies ein Fehler in .net ist.

 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

Ist dies eine Nebenwirkung der Politik? Was passiert, wenn Sie nur die Standardrichtlinie oder andere Richtlinien verwenden?

Andere Option ist, den Cache selbst zu verwalten.

+0

Ich habe Ihren Vorschlag ausprobiert, die Cache-Richtlinie auf den Standardwert zu setzen. Die gleichen Ergebnisse, scheint wie Einstellung der Komprimierung deaktiviert Richtlinie. Ich weiß, dass ich einen Cache selbst implementieren kann, aber das ist nicht besonders trivial :-) – AngelBlaZe