我有一个 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/