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


81

내 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 서버 구성에 액세스 할 수없는 공유 호스팅 서버에 있기 때문입니다). 또한 위의 코드에서 마지막 두 줄을 얻지 못했습니다. 왜 사용되는지,이 줄의 목적은 무엇입니까? 설명 해주십시오!


답변:


28

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

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

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

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


4
안녕하세요 @Ben, IIS를 사용하여 파일을 압축하는 방법, 수행해야하는 모든 설정, IIS 구성에 대한 액세스 권한이 없지만 시도해 보겠습니다. IIS를 사용하여 파일을 압축하는 방법을 알려주십시오. 감사!
Prashant

4
stackoverflow.com/a/6992948/8479 는 IIS7 이상에 필요한 web.config의 간단한 변경 사항을 자세히 설명합니다.
Rory

47

다음은 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하는 방법


4
마지막 줄을 제거해야합니다
JeffT

사실이지만 실제로 여는 <system.webServer> ...를 추가하여 구성 위치를 알 수 있습니다.
Carlos R Balebona 19

동일한 코드를 추가했지만 파일이 압축되지 않습니다
Zeeshan Ahmad Khalil

다른 것을 추가해야합니까?
Zeeshan Ahmad Khalil

16

이것은 당신이 그것을 시도하는 데 유용 할 수 있습니다. 이것은 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");
        }
    } 

2
이 코드에 감사드립니다. IIS 콘솔에 액세스 할 수없는 특정 사이트의 콘텐츠를 gzip / 축소해야했는데 이것이 도움이되었습니다. 하지만 질문 하나 :이 코드는 모든 aspx 파일을 압축하고 CSS 및 ScriptResources를 gzip하는 것으로 보이지만 .js 파일을 gzip하는 것은 아닙니다. 그렇게하는 방법이 있습니까? 감사.
Rafael Merlin

다음과 같은 품질 지침을 처리하지 않기 때문에 이것은 잘못된 것 gzip;q=0,deflate입니다. singular.co.nz/2008/07/…
oligofren

11

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


정말
끔찍한

3

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

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


2

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


0

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


0

<system.webServer>요소 내의 web.config 파일에 다음을 추가하기 만하면됩니다 .

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

참고 : 이전 버전의 IIS (v7.5 미만)를 사용하는 경우 프로세스가 CPU 집약적이기 때문에 doDynamicCompression을 false로 설정할 수 있습니다. 이러한 문제는 IIS 7.5에서 해결되었습니다.

참조 : https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression


0

web.config 파일을 사용하여 수행하십시오.

<system.webServer>
    <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"/>
</system.webServer>

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.