2009-03-24 9 views
42

mi sto cercando di fare una richiesta che accetta una risposta compressaDoes HttpWebResponse di .NET decomprime automaticamente le risposte GZiped e Deflated?

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); 

mi chiedo se quando aggiungo la seconda linea dovrò gestire la decompressione manualmente.

+0

Credo Rick Strahl deve essere sbagliato. Hai provato tu stesso? – Keltex

+0

grazie - solo cercando di capire le cose, puoi dirmi se è corretto? (a) se non si aggiunge questa riga "AcceptEncoding" allora - se si scarica un file non compresso => ​​funziona FINE - se si scarica un file compresso => ​​PROBLEMA (verrà scaricato il file ma apparirà corrotto, come non è stato decompresso) (b) se si aggiunge questa riga "AcceptEncoding" allora: - se si scarica un file non compresso => ​​funziona ancora FINE - se si scarica un file compresso => ​​funziona correttamente (sarà non compresso) È giusto? – Greg

+1

@Greg Nessuna delle opzioni. La seconda riga non riguarda il download di file che potrebbero essere già compressi (ad es. File zip), ma il download di risorse Web che possono essere compresse su richiesta (ad esempio file html). Se non si inserisce la seconda riga, un server web ben educato non invierà affatto file compressi. Se il server web ha la capacità di comprimere i file, lo farà solo se metti la seconda linea. –

risposta

102

Ho trovato la risposta.

È possibile modificare il codice per:

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

e si avrà la decompressione automatica. Non c'è bisogno di cambiare il resto del codice.

+2

bella risposta, mi ha aiutato molto :) –

+5

Tecnicamente ti serve solo la riga "AutomaticDecompression". Sembra aggiungere automaticamente "gzip, deflate" alle intestazioni. – LongZheng

+0

Perfetto lavorato! Grazie molto! –

-3

Penso che tu debba decomprimere il flusso da solo. Ecco un articolo su come farlo:

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

+0

vedere la mia risposta sotto –

+0

Buona scoperta. Sembra che sia stato aggiunto in .NET 2.0. Forse Strahl quando ha scritto il suo articolo era abituato a 1.1 – Keltex

+0

Usando HttpWebRequest.AutomaticDecompression aggiunge automaticamente le intestazioni di richiesta appropriate e gestisce la decompressione. – Armbrat

-2

GZIP e sgonfiare le risposte non vengono gestiti automaticamente. Vedi questo articolo per i dettagli: HttpWebRequest and GZip Http Responses

+0

Questo non è vero. – Armbrat

+0

Mi dispiace, stavo mescolando questo con le classi di richiesta e risposta di HttpListener. La richiesta web standard in .Net gestisce effettivamente le risposte compresse. –

0

Per .NET Core le cose sono un po 'più coinvolte. Un GZipStream è necessario in quanto non v'è una proprietà (al momento di scrivere) per AutomaticCompression Si consideri il seguente esempio 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}"; 
     } 
    } 
}