c# - code - ¿HttpWebResponse de.NET descomprime automáticamente las respuestas GZiped y Deflated?
webrequest post parameters c# (4)
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 añada la segunda línea tendré que manejar la descompresión manualmente.
Creo que tienes que descomprimir la corriente tú mismo. Aquí hay un artículo sobre cómo hacerlo:
Encontré la respuesta.
Puede cambiar el código a:
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
Y tendrás descompresión automática. No es necesario cambiar el resto del código.
Las respuestas GZIP y Deflate no se manejan automáticamente. Consulte este artículo para conocer los detalles: HttpWebRequest y GZip Http Respuestas
Para .NET Core las cosas son un poco más complicadas. Se necesita un GZipStream
ya que no hay una propiedad (a partir de la escritura) para AutomaticCompression
Considere el siguiente ejemplo de 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}";
}
}
}