Qué .NET de HttpWebResponse descomprimir automáticamente GZiped y desinflados respuestas?
-
21-08-2019 - |
Pregunta
Estoy tratando de hacer una solicitud que acepta una respuesta comprimida
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
Me pregunto si cuando agrego la segunda línea voy a tener que manejar la descompresión de forma manual.
Solución
He encontrado la respuesta.
Puede cambiar el código para:
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
Y tendrá descompresión automática. No hay necesidad de cambiar el resto del código.
Otros consejos
Para las cosas básicas .NET son un poco más complicado. Se necesita una GZipStream
ya que no es una propiedad (como la escritura) para AutomaticCompression
Considere el siguiente GET
ejemplo:
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 y desinflar las respuestas no se manejan de forma automática. Consulta este artículo para los detalles: HttpWebRequest y gzip respuestas HTTP
Yo creo que hay que descomprimir el flujo de sí mismo. He aquí un artículo sobre cómo hacerlo: