2009-03-24 2 views
42

나는 압축 응답 내가 두 번째 줄을 추가 할 때 수동으로 압축 해제를 처리해야합니다 궁금.NET의 HttpWebResponse가 GZiped 및 Deflated 응답을 자동으로 압축합니까?

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

을 수락 요청을하려고하고있다.

+0

나는 릭 Strahl 잘못해야 추측 다음 GET 예를 살펴 AutomaticCompression에 대한 (작성 등) 속성이없는 같이 GZipStream이 필요하다. 너 혼자 해봤 니? – Keltex

+0

감사합니다. 단지 일을 이해하려고 노력하고 있습니다. 이것이 맞는지 말해 줄 수 있습니까? (a)이 "AcceptEncoding"줄을 추가하지 않으면 - 압축되지 않은 파일 =>을 다운로드하는 경우 FINE - 압축 파일을 다운로드하는 경우 => 문제 (파일을 다운로드하지만 손상된 것처럼 보임) 압축되지 않은 파일) (b)이 "AcceptEncoding"줄을 추가하는 경우 : - 압축되지 않은 파일을 다운로드하는 경우 => 여전히 작동 함 FINE - 압축 파일을 다운로드 한 경우 => 정상적으로 작동합니다. 압축되지 않음) 맞습니까? – Greg

+1

@Greg 아무 옵션도 없습니다. 두 번째 줄은 이미 압축 된 파일 (예 : zip 파일)을 다운로드하는 것이 아니라 필요할 때 압축 될 수있는 웹 리소스 (예 : html 파일)를 다운로드하는 방법입니다. 두 번째 줄을 입력하지 않으면 잘 작동하는 웹 서버가 압축 파일을 전혀 보내지 않습니다. 웹 서버에 파일 압축 기능이있는 경우 두 번째 줄을 입력해야만 파일이 압축됩니다. –

답변

102

답변을 찾았습니다.

당신은에 코드를 변경할 수 있습니다

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

그리고 당신은 자동 압축 해제가됩니다. 나머지 코드는 변경할 필요가 없습니다.

+2

멋진 답변, 많은 도움이되었습니다 :) –

+5

기술적으로 "자동 압축 해제"라는 한 줄만 있으면됩니다. 헤더에 "gzip, deflate"를 자동으로 추가하는 것 같습니다. – LongZheng

+0

완벽하게 작동했습니다! 많은 감사합니다! –

-3

직접 스트림을 압축해야한다고 생각합니다. 여기에 그것을 수행하는 방법에 대한 기사는 다음과 같습니다

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

+0

아래 내 대답을 참조 –

+0

좋은 찾으십시오. NET 2.0에서 추가 된 것 같습니다. 어쩌면 Strahl이 그의 기사를 쓸 때 그는 1.1에 익숙했습니다 – Keltex

+0

HttpWebRequest.AutomaticDecompression을 사용하면 자동으로 적절한 요청 헤더를 추가하고 압축 해제를 처리합니다. – Armbrat

-2

GZIP과와 Deflate 응답이 자동으로 처리되지 않습니다. 자세한 내용은이 기사를 참조하십시오. HttpWebRequest and GZip Http Responses

+0

사실이 아닙니다. – Armbrat

+0

죄송합니다.이 클래스를 HttpListener의 요청 및 응답 클래스와 혼합했습니다. .Net의 표준 웹 요청은 실제로 압축 된 응답을 처리합니다. –

0

.NET 용 핵심 사항은 좀 더 복잡합니다.

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}"; 
     } 
    } 
} 
관련 문제