[c#] ASP.NET에서 GZip 압축을 구현하는 방법은 무엇입니까?

내 asp.net 페이지 (내 CSS 및 JS 파일 포함)에 대해 GZip 압축을 구현하려고합니다. 다음 코드를 시도했지만 .aspx 페이지 만 압축합니다 ( YSlow 에서 찾았습니다 ).

HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;

위의 코드는 외부 파일로 포함 된 CSS 및 JS 파일이 아닌 내 .aspx 페이지 코드 (마크 업) 만 압축합니다. 코드를 사용하여 ASP.NET에서 GZip 압축을 구현하는 방법을 알려주십시오 (IIS 서버 구성에 액세스 할 수없는 공유 호스팅 서버에 있기 때문입니다). 또한 위의 코드에서 마지막 두 줄을 얻지 못했습니다. 왜 사용되는지,이 줄의 목적은 무엇입니까? 설명 해주십시오!



답변

JS 및 CSS 파일을 압축하려면 실제로 IIS 수준에서 처리해야합니다. 이러한 파일은 ASP.NET 런타임없이 직접 렌더링되기 때문입니다.

IIS에서 aspnet_isapi.dll에 JSX 및 CSSX 확장 매핑을 만든 다음 우편 번호를 활용할 수 있지만 IIS가 더 나은 작업을 수행 할 수 있습니다.

콘텐츠 인코딩 헤더는 렌더링하기 전에 콘텐츠의 압축을 풀어야 함을 브라우저에 알립니다. 일부 브라우저는 콘텐츠의 모양에 따라이 문제를 파악할 수있을만큼 똑똑하지만 그냥 알려주는 것이 좋습니다.

Accept-encoding 캐시 설정은 gzip으로 압축 된 콘텐츠의 캐시 된 버전이 text / html 만 요청한 브라우저로 전송되지 않도록하기위한 것입니다.


답변

다음은 css 및 javascript 파일에 대한 솔루션입니다. web.config 파일 내부에 다음 코드를 추가합니다.

  <httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>

크레딧 : ASP.NET 및 GoDaddy에서 GZip하는 방법


답변

이것은 당신이 그것을 시도하는 데 유용 할 수 있습니다. 이것은 deflate 및 gzip 압축을 허용합니다.

    void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (app.Context.CurrentHandler == null)
            return;

        if (!(app.Context.CurrentHandler is System.Web.UI.Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (acceptEncoding == null || acceptEncoding.Length == 0)
            return;

        acceptEncoding = acceptEncoding.ToLower();

        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
            // deflate
            app.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
        else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
    }


답변

ASPX 파일 만 압축하는 이유는 작성한 코드가 ASPX 파일에만 포함되어 있기 때문입니다. ASPX 파일은 포함 된 링크 된 콘텐츠와는 별도의 요청입니다. 따라서 다음을 포함하는 ASPX 페이지가있는 경우 :

<img src="www.example.com\exampleimg.jpg" alt="example" />

이는 브라우저에서 리소스에 대한 2 개의 요청 (DNS 조회 제외)에 해당합니다.

  1. aspx 페이지 및
  2. aspx 페이지에 포함 된 이미지의 경우.

각 요청에는 자체 응답 증기가 있습니다. 게시 한 코드는 ASPX 응답 스트림에만 첨부되므로 ASPX 페이지 만 압축됩니다. 게시 된 코드의 1 번과 2 번 줄은 기본적으로 페이지의 정상적인 응답 스트림을 인수하고이 경우 GZip 스트림을 사용하여 일반 출력 스트림을 먹고 압축하여 대신 전송하는 “중간자”코드를 삽입합니다.

라인 3과 4는 응답 헤더를 설정합니다. 모든 http 요청 및 응답에는 콘텐츠 전에 전송되는 헤더가 있습니다. 이들은 요청 / 응답을 설정하여 서버와 클라이언트가 전송되는 내용과 방법을 알 수 있도록합니다.

이 경우 라인 3은 응답 스트림이 gzip을 통해 압축되어 표시되기 전에 클라이언트 브라우저에 의해 압축 해제되어야 함을 클라이언트 브라우저에 알립니다.

그리고 4 행은 단순히 응답의 Accept-Encoding 헤더를 켜는 것입니다. 그렇지 않으면 응답에서 누락되었을 것입니다.

* .js 및 * .css와 같은 여러 다른 MIME 유형을 압축 할 수 있도록 작성 / 구할 수있는 플러그 형 모듈이 있지만 IIS의 기본 제공 압축 기능을 사용하는 것이 좋습니다.

어떤 버전의 IIS를 사용하고 있는지는 언급하지 않았지만 IIS 7.0 인 경우 <system.webserver>web.config 파일 의 섹션에 다음과 같은 내용을 포함해야 합니다.

<httpCompression>
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
 <staticTypes>
         <add mimeType="text/*" enabled="true" />
      </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" />

..

Richard


답변

IIS7에서는 모든 요청이 .net으로 이동하므로 이러한 헤더를 모든 응답에 추가하는 HttpModule을 만들어야합니다.

IIS7이 없으면 공유 호스팅에서 사용하지 않는 .net 파일 확장명 (예 : .asmx)을 매핑 한 처리기를 만들고 web.config에서 .asmx 파일이 설정된 HttpHandler로 이동하도록 지정해야합니다. .jpg 등의 경로를 다시 작성하고 헤더도 설정합니다.


답변

마지막 질문에 대답합니다. 이 두 줄은 브라우저로 다시 전송되는 응답에 대한 HTTP 헤더를 설정합니다. Content-Encoding응답이 gzip으로 인코딩되고 디코딩되어야 함을 브라우저에 알립니다. 마지막 줄 Accept-EncodingVary 헤더에 추가 됩니다 . 이를 통해 브라우저 또는 프록시는 응답이 고유한지 또는 특정 다른 헤더의 영향을 받는지 여부를 확인하고 캐싱을 조정할 수 있습니다.


답변

.aspx 확장자를 .css 또는 .js 파일에 추가합니다. 올바른 MIME 유형으로 제공하려면 파일 내에서 <% @ Page ContentType = “text / css”%> 또는 javascript를 사용하십시오. & URL 재 작성을 사용하여 사용자 에이전트 브라우저에서이를 숨 깁니다. 콘텐츠 인코딩 응답 헤더에는 gzip이 추가되어 gzip이 압축을 수행하는 데 사용되는 방법임을 전달합니다. 응답 헤더를 Accept-Encoding으로 설정하여 모든 캐시가 어떤 페이지 (압축 또는 비 압축)를 제공해야하는지 알 수 있도록 요청의 Accept-Encoding 헤더에 따라 달라집니다. https://stackoverflow.com/a/14509007/1624169 에서 이에 대해 자세히 설명했습니다.