2013-06-26 2 views
18

나는 나의 MVC의 행동에 대한 압축 필터를 사용하여 봤는데 :압축 필터는

http://msdn.microsoft.com/en-us/magazine/gg232768.aspx

나는 다시 목적을 위해 웹 API에 대한 비슷한 일을 할 수있는 코드를 시도했습니다 그러나 나는 방책을 쳤다 :

public class CompressAPIAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext) 
    { 
     var preferredEncoding = GetPreferredEncoding(filterContext.Request); 
     Stream compressedStream = null; 
     // Compress the response accordingly 
     var response = filterContext.Response; 
     response.Headers.Add("Content-encoding", preferredEncoding.ToString()); 

     if (preferredEncoding == CompressionScheme.Gzip) 
     { 
      response.Content = new GZipStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK 
     } 

     if (preferredEncoding == CompressionScheme.Deflate) 
     { 
      response.Content = new DeflateStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK 
     } 
     return; 
    } 

    enum CompressionScheme 
    { 
     Gzip = 0, 
     Deflate = 1, 
     Identity = 2 
    } 

    private CompressionScheme GetPreferredEncoding(HttpRequestMessage request) 
    { 
     var acceptableEncoding = request.Headers.AcceptEncoding; 

     if (acceptableEncoding.Where(h => h.Value.Contains("gzip")).Count() > 0) 
      return CompressionScheme.Gzip; 

     if (acceptableEncoding.Where(h => h.Value.Contains("deflate")).Count() > 0) 
      return CompressionScheme.Deflate; 

     return CompressionScheme.Identity; 
    } 

응답의 내용에 압축 된 스트림을 어떻게 할당 할 수 있습니까?

나는 제어 할 수없는 IIS 6.0에서이 호스트가 호스팅되고 있음을 지적해야합니다.

+2

'DelegatingHandler'되어 편집

  • (모두 JSON 포맷을 커버 위 이외에 "문자셋 = UTF-8 응용 프로그램/JSON"를 포함) 해결책을 설명하는 답변이 이미 있습니다. http://stackoverflow.com/questions/10443588/mvc4-webapi-compress-get-method-response – tpeczek

  • +0

    필터를 사용하면 특정 webapi 작업 만 지정할 수 있습니다. DelegatingHandler가 모든 작업을 압축하도록 강요합니까? –

    답변

    40

    아니요이 작업 필터는 모델 바인딩 단계가 발생하기 전에 수행해야하며 작업 필터가 실행되기 전에 모델 작성 중에 포맷터가 스트림을 읽고 비 직렬화 할 수 있으므로 실패 할 수 있습니다.

    IIS를 사용하는 경우, 다음 (스콧 Hanselman은의 blog post에서 일부 조각이 다음 한) 설치 압축 다음을 수행하십시오

    • 는 IIS에서 "동적 압축"기능을 사용.

    • IIS 관리자로 돌아 가면 SERVER에 대한 페이지로 이동, 사이트 없습니다. 구성 편집기를 클릭 : enter image description here

    • 을 드롭 다운에서의 system.webServer/httpCompression 선택 enter image description here

    • 그런 다음 동적 유형을 클릭하고 지금은 목록 편집기에서 이니까, 어떤 종류의 생각 당신 압축 싶어요. 기본적으로 /은 거짓이지만 그 기능을 켜기 만하면됩니다. 아래 보이는 것처럼 좀 더 까다 롭고 application/atom + xml, application/json 및 application/atom + xml; charset = utf-8을 추가하기로했습니다. application/atom + xml과 application/atom + xml; charset = utf-8은 별개의 항목입니다. 언제든지 여기에 mimeTypes를 추가하십시오. 당신이 그들을 추가하고 대화 상자를 닫은 후 enter image description here
    • , 새로운 모듈을로드다시 시작 당신의 IIS 서비스 적용을 클릭하십시오.
    • 이제 Accept-Encoding 헤더를 사용하여 요청을 만들고 예상대로 응답을보아야합니다. ASP.NET 웹 API 더 나은 접근 방식에서

    +1

    좋은 물건! 불행히도 IIS 6.0에서 서버를 제어 할 필요가 없습니다. –

    +1

    참고 : 구성 편집기 (IIS 7과 같은)가없는 경우 WebInstaller에서 Administration Pack을 설치하십시오. – Kugel

    +0

    "Accept-Encoding : deflate"가 작동하지 않는 경우. – Artiom