Распаковывает ли HttpWebResponse .NET автоматически ответы GZiped и Deflated?
-
21-08-2019 - |
Вопрос
Я пытаюсь выполнить запрос, который принимает сжатый ответ
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
Интересно, придется ли мне, когда я добавлю вторую строку, вручную выполнять распаковку?
Решение
Я нашел ответ.
Вы можете изменить код на:
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
И у вас будет автоматическая декомпрессия.Оставшуюся часть кода менять не нужно.
Другие советы
С .NET Core дела обстоят немного сложнее.А GZipStream
необходим, поскольку не существует свойства (на момент написания) для AutomaticCompression
Рассмотрим следующее GET
пример:
var req = WebRequest.CreateHttp(uri);
/*
* Headers
*/
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
/*
* Execute
*/
try
{
using (var resp = await req.GetResponseAsync())
{
using (var str = resp.GetResponseStream())
using (var gsr = new GZipStream(str, CompressionMode.Decompress))
using (var sr = new StreamReader(gsr))
{
string s = await sr.ReadToEndAsync();
}
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string respStr = sr.ReadToEnd();
int statusCode = (int)response.StatusCode;
string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
}
}
}
Ответы GZIP и Deflate не обрабатываются автоматически.Подробности смотрите в этой статье: HttpWebRequest и GZip Http-ответы
Я думаю, вам придется распаковать поток самостоятельно.Вот статья о том, как это сделать:
Не связан с StackOverflow