Program Tip

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

programtip 2020. 10. 10. 10:52
반응형

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 스트림을 사용하여 일반 출력 스트림을 먹고 압축하여 대신 전송하는 "중간자"코드를 삽입합니다.

Lines 3 & 4 are setting up the response headers. All http requests and responses have headers that are sent prior to the content. These set up the request/response so that the server and client know what is being sent and how.

In this case Line 3 is informing the client browser that the response stream is compressed via gzip and therefore needs to be de-compressed by the client browser prior to display.

And Line 4 is simply turning on the Accept-Encoding header of the response. This would otherwise have been absent from the response.

There are pluggable modules you can write/obtain that allow you to compress a multitide of other MIME type such as *.js and *.css but you're better off just using the built in compression functionality of IIS.

You haven't said which verson of IIS you are using but if it were IIS 7.0, it would require that you include something like the following into the <system.webserver> section of you web.config file:

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

..

Richard


In IIS7 all requests go to .net, so you would have to create an HttpModule that added those headers to all responses.

Without IIS7, and on shared hosting, you would have to creare a handler that mapped a .net file extention that you are not using (like .asmx) and in the web.config specify that .asmx files go to your HttpHandler which is set to rewrite the path to .jpg or whatever and set the header there too.


To answer your last question. Those two lines set HTTP headers for the response sent back to the browser. Content-Encoding tells the browser that the response is encoded as gzip and it needs to be decoded. The last line adds Accept-Encoding to the Vary header. With this the browser or proxies can determine whether the response was unique or is influenced by certain other headers and adjust their caching.


Add .aspx extension to .css or .js file. Use <%@ Page ContentType="text/css" %> or javascript within the file to serve it with correct MIME type. & use URL Rewrite to hide this from the user agent browsers. The content-encoding response header is appended gzip to convey that gzip is the method used to perform compression. Vary response header's set to Accept-Encoding so all caches know which page (compressed or uncompressed) should be served depends on request's Accept-Encoding header. I've elaborated on this at https://stackoverflow.com/a/14509007/1624169


You can just add the following to your web.config file within the <system.webServer> element:

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

NOTE: If you are using an older version of IIS (less than v7.5), you may want to set doDynamicCompression to false because the process was CPU intensive. These issues were cleared up in IIS 7.5.

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


Either do it with the web.config file

<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>

Or you can do it through IIS. For compressing JS & CSS files you actually have to handle that at the IIS level, since these files are rendered directly without the ASP.NET runtime.

You could make a JSX & CSSX extension mapping in IIS to the aspnet_isapi.dll and then take advantage of your zip code, but IIS is likely to do a better job of this for you.

The content-encoding header tells the browser that it needs to unzip the content before rendering. Some browsers are smart enough to figure this out anyway, based on the shape of the content, but it's better to just tell it.

The Accept-encoding cache setting is there so that a cached version of the gzipped content won't be sent to a browser that requested only text/html.

참고URL : https://stackoverflow.com/questions/552317/how-to-implement-gzip-compression-in-asp-net

반응형