Как совместить сжатие и кеширование в HttpWebRequest?

У меня есть клиент С#, разговаривающий с веб-сервисом cherrypy (http/rest). Проблема в том, что я не могу одновременно включить сжатие и кэширование.

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

Пропуская приведенную выше строку, я получаю правильные заголовки кэширования (If-None-Math,If-Modified-Since), а комментируя ее, получаю заголовки сжатия (Accept-Encodig:gzip), но не заголовки кэширования. Мне кажется это баг, но может я что-то не так делаю.

[полный код]

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

person AngelBlaZe    schedule 13.04.2009    source источник


Ответы (2)


Я реализовал обходной путь, см. код ниже. Я решил, что справиться со сжатием проще, чем с кэшированием, поэтому я сам реализовал часть сжатия. Довольно просто благодаря сообщению в блоге: Ответы HttpWebRequest и GZip Http; Я все еще думаю, что это ошибка в .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;
    }
person AngelBlaZe    schedule 19.04.2009

Является ли это побочным эффектом политики? Что произойдет, если вы просто используете политику по умолчанию или другие политики?

Другой вариант — управлять кешем самостоятельно.

person david valentine    schedule 13.04.2009
comment
Я попробовал ваше предложение, установив политику кэширования по умолчанию. Те же результаты, похоже, что настройка сжатия отключает политику. Я знаю, что могу реализовать кеш самостоятельно, но это не совсем тривиально :-) - person AngelBlaZe; 14.04.2009