c# - 如何在 HttpWebRequest 中混合压缩和缓存?

标签 c# caching httpwebrequest http-compression

我有一个 C# 客户端与 Cherrypy(http/rest) Web 服务通信。 问题是我无法同时打开压缩和缓存。

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

通过省略上面的行,我得到了正确的缓存 header (If-None-Math,If-Modified-Since),同时注释掉它让我得到压缩 header (Accept-Encodig:gzip),但不是缓存 header 。在我看来,这就像一个错误,但也许我做错了什么。

[完整代码]

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

最佳答案

我已经实现了一个解决方法,请参阅下面的代码。我认为处理压缩比处理缓存更容易,所以我自己实现了压缩部分。感谢一篇博客文章,非常简单:HttpWebRequest and 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;
    }

关于c# - 如何在 HttpWebRequest 中混合压缩和缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/744204/

相关文章:

ASP.net - 通过查询字符串缓存 (VaryByParam)

c# - HttpWebRequest.Headers.Add ("Cookie",值)与 HttpWebRequest.CookieContainer

java - 为http服务生成java类

c# - Asp.net - 用于存储字典的缓存与静态变量

java - 如何让丢失的条目在 Guava 中更快地过期

javascript - 如何仅使用 javascript(不使用 Jquery)序列化对象?

c# - EnumerateFiles() 如何工作?

c# - 在 SQL Server 中跳过完全相同的记录

c# - 如何检查类型是否符合 C# 中的非托管约束?

c# - 方法 'Open' 没有重载/'Run' 采用 '1' 参数