2

私はcherrypy(http/rest)Webサービスと話しているac#クライアントを持っています。問題は、圧縮とキャッシュの両方を同時にオンにできないことです。

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

2 に答える 2

3

回避策を実装しました。以下のコードを参照してください。キャッシュよりも圧縮の方が扱いやすいと判断したので、自分で圧縮部分を実装しました。ブログ投稿のおかげで非常に簡単です:HttpWebRequestとGZip Http Responses ; これはまだ.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;
    }
于 2009-04-19T12:12:43.897 に答える
0

これはポリシーの副作用ですか? デフォルトのポリシーやその他のポリシーをそのまま使用するとどうなりますか?

他のオプションは、キャッシュを自分で管理することです。

于 2009-04-13T16:28:02.557 に答える