IIS7에서 MVC3를 사용할 때 gzip 압축을 어떻게 활성화합니까?


100

아무도 MVC 3에서 gzip 압축을 활성화하는 방법을 알고 있습니까? IIS7을 사용하고 있습니다.

Google 크롬 감사 결과 :

  1. gzip 압축 활성화 (4)
  2. 다음 리소스를 gzip으로 압축하면 전송 크기를 약 2/3 (~ 92.23KB) 줄일 수 있습니다.
  3. / mydomain /은 ~ 1.53KB를 절약 할 수 있습니다.
  4. jquery-1.4.4.min.js는 ~ 51.35KB를 절약 할 수 있습니다.
  5. Cufon.js는 ~ 11.89KB를 절약 할 수 있습니다.
  6. Futura.js는 ~ 27.46KB를 절약 할 수 있습니다.

복제를 조용히하지 않음 : stackoverflow.com/q/552317/712526
jpaugh

답변:


143

web.config다음과 같이 파일을 통해 압축을 구성 할 수 있습니다 .

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

이 구성 요소에 대한 설명서는 iis.net/ConfigReference 에서 찾을 수 있습니다 . 이것은 다음과 동일합니다.

  1. 인터넷 정보 서비스 (IIS 관리자) 열기
  2. 수정하려는 가상 디렉터리에 도달 할 때까지 왼쪽의 트리보기를 탐색합니다.
  3. 오른쪽 창의 제목이 해당 가상 디렉터리의 이름이되도록 적절한 가상 디렉터리를 선택합니다.
  4. 오른쪽 창의 "IIS"에서 "압축"선택
  5. 두 옵션을 모두 선택하고 맨 오른쪽의 "작업"에서 "적용"을 선택합니다.

참고 : (주석에서 지적했듯이) Http Dynamic Compression이 설치되어 있는지 확인해야합니다. 그렇지 않으면 설정 doDynamicCompression="true"이 적용되지 않습니다. 이를 수행하는 가장 빠른 방법은 다음과 같습니다.

  1. 시작> 입력 optionalfeatures( "Windows 기능 켜기 또는 끄기"창으로 이동하는 가장 빠른 방법)
  2. "Windows 기능"트리보기에서 인터넷 정보 서비스> World Wide Web 서비스> 성능 기능으로 이동합니다.
  3. "동적 콘텐츠 압축"이 선택되어 있는지 확인합니다.
  4. "확인"을 클릭하고 Windows가 구성 요소를 설치하는 동안 기다립니다.

11
이 작업을 수행하려면 Http Compression Dynamic IIS 옵션을 설치해야합니다. 이 답변의 구성 참조 링크에는 세부 정보가 있습니다.
Caleb Vear 2012 년

16
Windows Server 2008 optionalfeatures에서는 작동하지 않았습니다. 대신 서버 관리자> 역할> 웹 서버 (IIS)로 스크롤 한 다음 역할 서비스 추가를 클릭합니다. 이제 웹 서버> 성능> 정적 컨텐츠 압축 및 동적 컨텐츠 압축이 설치되었는지 확인하십시오.
Rory

1
이로 인해 "Vary :"호스트 헤더가 엉망이 될 수 있습니다. 더 많은 정보 : stackoverflow.com/questions/5372052/...
jjxtra

2
적어도 내 경험상 이것은 MVC 컨트롤러의 출력을 제외한 모든 것을 압축합니다. 어떤 이유로 gzip 압축없이 HTML을 반환합니다.
Chris Moschini

1
주의 !!! IIS 동적 압축은 버그 또는 기능인 Vary 헤더를 제거합니다. 모르겠지만 캐시가 올바르게 작동하도록하려면 사용자 지정 필터를 구현하는 것이 더 합리적입니다.
Akash Kava 2014 년

31

그렇게한다면 코드에서 할 수 있습니다. 모든 컨트롤이 상속되는 basecontroller를 만들고 아래의이 속성으로 장식합니다.

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
    }
}

2
@JustAnotherUserYouMayKnow-리소스를 제공하는 방법에 따라 다릅니다. 서버의 파일을 직접 가리키고 있다면 아니요.하지만 리소스 관리 시스템이 허용하는 것처럼 작업을 통해 파일을 제공하면 훌륭하게 작동합니다. BTW 릭 Strahl는 클라이언트가 실제로 지원하는 검사로 갱신이가 지원하는 압축하기 전에 gzip을
폴 캐롤

4
리디렉션의 경우 filternull 이 되는 것을 방지하는 것이 중요합니다 . 나는 var response = ...;if( response == null || response.Filter == null)return;.
Travis J

2
또한을 gzip대신 사용하고 싶을 수도 deflate있습니다. 자세한 내용은 다음을 참조하십시오. stackoverflow.com/a/9856879/1026459
Travis J

IIS는 압축 된 파일을 캐시하므로 성능 향상을 위해 다시 압축 할 필요가 없습니다. 가능한 경우 IIS를 사용하고 IIS 압축을 사용할 수없는 경우에만이 방법을 사용하십시오.
Muhammad Rehan Saeed

1
이러한 솔루션은 MVC5, IIS 8.5, .Net 4.5 Localhost에서 작동하지 않습니다. 어떻게해야합니까, 어떤 제안이 있습니까?
aadi1295

12

압축은 서버 수준에서 활성화 / 비활성화됩니다. iis 관리 콘솔의 IIS 압축 모듈을 참조하십시오.

다음은 Microsoft 사이트의 IIS 지침입니다 .


1
web.config에서도 설정할 수 있습니다
Jack Marchetti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.