2009-03-24 19 views
42

que estoy tratando de hacer una solicitud que acepta una respuesta comprimida¿HttpWebResponse de .NET descomprime automáticamente las respuestas GZiped y Deflated?

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.

+0

supongo Rick Strahl debe estar mal. ¿Lo has intentado tú mismo? – Keltex

+0

gracias - solo trato de entender las cosas, ¿me puede decir si esto es correcto? (a) si NO agrega esta línea "AcceptEncoding" entonces - si descarga un archivo no comprimido => funciona FINE - si descarga un archivo comprimido => ISSUE (descargará el archivo pero se verá dañado, como no se ha descomprimido) (b) si agrega esta línea "AcceptEncoding", entonces: - si descarga un archivo no comprimido => todavía funciona FINE - si descarga un archivo comprimido => funciona bien (será sin comprimir) ¿Es esto correcto? – Greg

+1

@Greg Ninguna de las opciones. La segunda línea no se trata de descargar archivos que quizás ya estén comprimidos (es decir, archivos zip), sino de descargar recursos web que pueden comprimirse bajo demanda (es decir, archivos html). Si no pone la segunda línea, un servidor web con buen comportamiento no le enviará archivos comprimidos. Si el servidor web tiene la capacidad de comprimir archivos, solo lo hará si coloca la segunda línea. –

Respuesta

102

Encontré la respuesta.

Puede cambiar el código para:

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

y se le han descompresión automática. No es necesario cambiar el resto del código.

+2

buena respuesta, me ayudó mucho :) –

+5

Técnicamente solo necesitas una línea, "AutomaticDecompression". Parece agregar automáticamente "gzip, desinflar" a los encabezados. – LongZheng

+0

Perfecto trabajado! ¡Muchas gracias! –

-3

Creo que tiene que descomprimir la transmisión usted mismo. He aquí un artículo sobre cómo hacerlo:

http://www.west-wind.com/WebLog/posts/102969.aspx

+0

ver mi respuesta a continuación –

+0

Buen hallazgo. Parece que esto fue agregado en .NET 2.0. Tal vez Strahl cuando escribió su artículo fue utilizado para 1.1 – Keltex

+0

El uso de HttpWebRequest.AutomaticDecompression agrega automáticamente los encabezados de solicitud adecuados y maneja la descompresión. – Armbrat

-2

GZIP y desinflar las respuestas no se manejan de forma automática. Ver este artículo para los detalles: HttpWebRequest and GZip Http Responses

+0

Esto no es verdad. – Armbrat

+0

Lo siento, estaba mezclando esto con las clases de solicitud y respuesta de HttpListener. La solicitud web estándar en .Net realmente maneja las respuestas comprimidas. –

0

Para .NET Core las cosas son un poco más complicadas. Un GZipStream se necesita, ya que no es una propiedad (como la escritura) para AutomaticCompression Consideremos el siguiente ejemplo 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}"; 
     } 
    } 
} 
Cuestiones relacionadas