2009-03-24 14 views
42

Próbuję zrobić wniosek, że akceptuje skompresowany odpowiedźCzy HttpWebResponse .NET automatycznie dekompresuje odpowiedzi GZiped i Deflated automatycznie?

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

Zastanawiam się, czy kiedy dodać drugą linię będę musiał ręcznie obsługiwać dekompresji.

+0

Chyba Rick Strahl musi być nie tak. Czy próbowałeś sam? – Keltex

+0

dzięki - tylko próbując zrozumieć rzeczy, czy możesz mi powiedzieć, czy to prawda? (a) jeśli NIE dodasz tej linii "AcceptEncoding", a następnie - jeśli pobierzesz nieskompresowany plik => działa FINE - jeśli pobierzesz skompresowany plik => ISSUE (pobierze plik, ale będzie wyglądać na uszkodzony, jako nie był nieskompresowany) (b) jeśli dodasz tę linię "AcceptEncoding", to: - jeśli pobierzesz nieskompresowany plik => nadal działa FINE - jeśli pobierzesz skompresowany plik => działa dobrze (będzie nieskompresowany) Czy to prawda? – Greg

+1

@Greg Żadne z opcji. Druga linia nie polega na pobieraniu plików, które mogą być już skompresowane (np. Pliki zip), ale na pobieraniu zasobów sieciowych, które mogą być kompresowane na żądanie (np. Pliki HTML). Jeśli nie umieścisz drugiej linii, dobrze zachowany serwer WWW nie będzie w ogóle wysyłać skompresowanych plików. Jeśli serwer WWW ma możliwość kompresowania plików, zrobi to tylko wtedy, gdy wstawisz drugi wiersz. –

Odpowiedz

102

Znalazłem odpowiedź.

Można zmienić kod w celu:

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

i trzeba będzie automatyczną dekompresję. Nie trzeba zmieniać reszty kodu.

+2

dobra odpowiedź, bardzo mi pomogła :) –

+5

Technicznie potrzebujesz tylko jednej linii, "AutomaticDecompression". Wydaje się automatycznie dodawać "gzip, deflate" do nagłówków. – LongZheng

+0

Perfect działał! Wielkie dzięki! –

-3

Myślę, że sam musisz rozpakować strumień. Oto artykuł o tym, jak to zrobić:

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

+0

zobacz moją odpowiedź poniżej –

+0

Dobre znalezisko. Wygląda na to, że został dodany w .NET 2.0. Może Strahl, gdy napisał swój artykuł był przyzwyczajony do 1.1 – Keltex

+0

Używanie HttpWebRequest.AutomaticDecompression automatycznie dodaje odpowiednie nagłówki żądań i obsługuje dekompresję. – Armbrat

-2

GZIP i opróżnić odpowiedzi nie są obsługiwane automatycznie. Aby uzyskać szczegółowe informacje, zobacz ten artykuł: HttpWebRequest and GZip Http Responses

+0

To nie jest prawda. – Armbrat

+0

Niestety, miksowałem to z klasami żądania i odpowiedzi HttpListener. Standardowe żądanie sieciowe w .Net rzeczywiście obsługuje skompresowane odpowiedzi. –

0

Dla .NET Core rzeczy są nieco bardziej zaangażowane. GZipStream jest potrzebne, gdyż nie ma własność (stan na piśmie) do AutomaticCompression Rozważmy następujący przykład: 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}"; 
     } 
    } 
} 
Powiązane problemy