programing

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

i4 2023. 6. 15. 21:34
반응형

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 서버 구성에 액세스할 수 없는 공유 호스팅 서버에 있기 때문).그리고 위의 코드에서 저는 마지막 두 줄을 이해하지 못합니다. 왜 그것들이 사용되는지, 그리고 이 두 줄의 목적은 무엇인지.설명해 주세요!

여기에 css와 javascript 파일을 위한 솔루션이 있습니다.<시스템>에 다음 코드를 추가합니다.web.config 파일 내부의 webServer>:

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

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

JS 및 CSS 파일을 압축하는 경우 ASP.NET 런타임 없이 파일이 직접 렌더링되므로 IIS 수준에서 실제로 이를 처리해야 합니다.

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

내용 인코딩 헤더는 렌더링하기 전에 내용의 압축을 풀어야 한다는 것을 브라우저에 알립니다.일부 브라우저는 콘텐츠의 모양을 기반으로 하여 이 문제를 해결할 수 있을 정도로 똑똑하지만, 그냥 말하는 것이 좋습니다.

Accept-encoding cache 설정은 gzip된 콘텐츠의 캐시된 버전이 text/html만 요청한 브라우저로 전송되지 않도록 합니다.

이것은 당신이 그것을 시도하는 데 유용할 수 있습니다, 이것은 감압과 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" />

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

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

각 요청에는 자체 응답 증기가 있습니다.당신이 게시한 코드는 ASPX 응답 스트림에만 첨부되어 있기 때문에 당신의 ASPX 페이지만 압축됩니다.게시된 코드의 1행과 2행은 기본적으로 페이지의 정상적인 응답 스트림을 넘겨받아 이 경우 GZip 스트림으로 정상적인 출력 스트림을 먹고 압축하여 대신 와이어로 보내는 "중간자" 코드를 주입하는 것입니다.

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

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

그리고 4호선은 단순히 응답의 Accept-Encoding 헤더를 켜고 있습니다.그렇지 않으면 응답에서 누락되었을 수 있습니다.

*.js 및 *.css와 같은 다른 MIME 유형의 다중 계층을 압축할 수 있는 플러그형 모듈이 있지만 IIS의 기본 압축 기능을 사용하는 것이 좋습니다.

7을 사용 IIS 7.0에 시켜야 합니다.<system.webserver> of web 파일web.config 파일:

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

..

리차드.

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

IIS7을 사용하지 않고 공유 호스팅에서 사용하지 않는 .net 파일 확장자를 매핑하는 핸들러를 만들어야 하며(예: .asmx) web.config에서 .asmx 파일이 .jpg 또는 기타 경로로 다시 작성하도록 설정된 HttpHandler로 이동하고 헤더도 거기에 설정하도록 지정합니다.

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

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

다음을 웹.config 파일에 추가할 수 있습니다.<system.webServer>요소:

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

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

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

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 파일을 압축하는 경우 ASP.NET 런타임 없이 파일이 직접 렌더링되므로 IIS 수준에서 실제로 이를 처리해야 합니다.

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

내용 인코딩 헤더는 렌더링하기 전에 내용의 압축을 풀어야 한다는 것을 브라우저에 알립니다.일부 브라우저는 콘텐츠의 모양을 기반으로 하여 이 문제를 해결할 수 있을 정도로 똑똑하지만, 그냥 말하는 것이 좋습니다.

Accept-encoding cache 설정은 gzip된 콘텐츠의 캐시된 버전이 text/html만 요청한 브라우저로 전송되지 않도록 합니다.

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

반응형