В this answer я описал, как я применил wrappnig GZipStream вокруг потока ответов в HttpWebResponse, чтобы его распаковать.. NET: Можно ли заставить HttpWebRequest автоматически распаковывать ответы gzip'd?
Соответствующий код выглядит следующим образом:
HttpWebRequest hwr = (HttpWebRequest) WebRequest.Create(url);
hwr.CookieContainer =
PersistentCookies.GetCookieContainerForUrl(url);
hwr.Accept = "text/xml, */*";
hwr.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
hwr.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us");
hwr.UserAgent = "My special app";
hwr.KeepAlive = true;
using (var resp = (HttpWebResponse) hwr.GetResponse())
{
using(Stream s = resp.GetResponseStream())
{
Stream s2 = s;
if (resp.ContentEncoding.ToLower().Contains("gzip"))
s2 = new GZipStream(s2, CompressionMode.Decompress);
else if (resp.ContentEncoding.ToLower().Contains("deflate"))
s2 = new DeflateStream(s2, CompressionMode.Decompress);
... use s2 ...
}
}
Есть ли способ, чтобы получить HttpWebResponse, чтобы обеспечить поток де-сжатия, автоматически? Другими словами, способ устранить следующее из приведенного выше кода:
Stream s2 = s;
if (resp.ContentEncoding.ToLower().Contains("gzip"))
s2 = new GZipStream(s2, CompressionMode.Decompress);
else if (resp.ContentEncoding.ToLower().Contains("deflate"))
s2 = new DeflateStream(s2, CompressionMode.Decompress);
Спасибо.
Cha-ching! Благодарю. Как я пропустил это? – Cheeso
спасибо, я также исправил свой вопрос, чтобы использовать предложение use. – Cheeso
«Нет необходимости вручную добавлять HTTP-заголовок Accept-Encoding». Кроме того, если вы это сделаете, значения «gzip» и «deflate» будут дублированы в заголовке, что может привести к тому, что некоторые серверы отклонят запрос. – Chad