2009-03-24 10 views
42

Ich versuche, eine Anfrage zu tun, die eine komprimierte Antwort akzeptiertIst .NET HttpWebResponse dekomprimiert automatisch GZiped und Deflated Antworten?

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

Ich frage mich, ob, wenn ich die zweite Zeile hinzufügen, werde ich die Dekompression manuell handhaben müssen.

+0

ich Rick Strahl erraten muss falsch sein. Hast du es selbst ausprobiert? – Keltex

+0

danke - nur versuchen, die Dinge zu verstehen, können Sie mir sagen, ob das korrekt ist? (a) wenn Sie diese "AcceptEncoding" -Zeile nicht hinzufügen, dann - wenn Sie eine nicht komprimierte Datei herunterladen => funktioniert FINE - wenn Sie eine komprimierte Datei herunterladen => ISSUE (wird die Datei herunterladen, aber wird als korrupt aussehen, als war nicht unkomprimiert) (b) wenn Sie diese "AcceptEncoding" Zeile dann hinzufügen: - wenn Sie eine nicht komprimierte Datei herunterladen => funktioniert immer noch FINE - wenn Sie eine komprimierte Datei herunterladen => funktioniert gut (wird unkomprimiert) Ist das richtig? – Greg

+1

@Greg Keine der Optionen. In der zweiten Zeile geht es nicht um das Herunterladen von Dateien, die möglicherweise bereits komprimiert sind (z. B. ZIP-Dateien), sondern um das Herunterladen von Webressourcen, die bei Bedarf komprimiert werden können (z. B. HTML-Dateien). Wenn Sie die zweite Zeile nicht setzen, sendet Ihnen ein gut benannter Webserver überhaupt keine komprimierten Dateien. Wenn der Web-Server Dateien komprimieren kann, wird es nur funktionieren, wenn Sie die zweite Zeile setzen. –

Antwort

102

Ich fand die Antwort.

Sie können den Code ändern:

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

Und Sie werden automatische Dekompression haben. Keine Notwendigkeit, den Rest des Codes zu ändern.

+2

nette Antwort, hat mir sehr geholfen :) –

+5

Technisch brauchen Sie nur die eine Zeile, "AutomaticDecompression". Es scheint automatisch "gzip, deflate" zu den Headern hinzuzufügen. – LongZheng

+0

Perfekt gearbeitet! Danke vielmals! –

-3

Ich denke, Sie müssen den Stream selbst dekomprimieren. Hier ist ein Artikel auf, wie es geht:

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

+0

siehe meine Antwort unter –

+0

Gut finden. Sieht so aus, als wäre dies in .NET 2.0 hinzugefügt worden. Vielleicht hat Strahl, als er seinen Artikel schrieb, den er gewohnt war, 1.1 – Keltex

+0

Mit HttpWebRequest.AutomaticDecompression fügt automatisch die richtigen Anfrage-Header und behandelt die Dekomprimierung. – Armbrat

-2

GZIP und Deflate Antworten werden nicht automatisch. Siehe diesen Artikel für die Details: HttpWebRequest and GZip Http Responses

+0

Das ist nicht wahr. – Armbrat

+0

Entschuldigung, ich habe dieses mit den Request & Response-Klassen von HttpListener gemischt. Die Standard-Webanforderung in .NET verarbeitet in der Tat komprimierte Antworten. –

0

Für .NET Core Dinge sind ein wenig mehr beteiligt. Ein GZipStream ist erforderlich, da es nicht eine Eigenschaft (wie des Schreibens) ist für AutomaticCompression Betrachten Sie das folgende GET Beispiel:

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}"; 
     } 
    } 
}