ASP.NET 코어 파일 압축 에 자주 사용 되 는 오류(가장 좋 은 실천)

머리말
마이크로소프트 공식 문서 에 서 는 파일 압축 기능 의 사용 오류 가 명확 하 게 밝 혀 지지 않 았 다.
본 고 는 ASP.NET Core 파일 이 압축 에 응답 하 는 흔 한 오류 에 대해 설명 할 것 이다.
오류 1:Brotil 압축 을 사용 하지 않 음
추가 적 인 대가 가 거의 필요 하지 않 습 니 다.Brotil 압축 알고리즘 은 사이트 의 약 20%정적 자원 로드 성능 을 향상 시 킬 수 있 습 니 다.
Gzip/Brotil 압축 사용 하기
Gzip 은 더 좋 은 user-agent 호환성 을 가지 고 있 으 며,Brotli 는 더 좋 은 성능 을 가지 고 있 습 니 다.
그래서 우 리 는 보통 ASP.NET Core 사이트 에서 이 두 가지 압축 을 동시에 사용 해 야 한다.
Gzip 압축 과 Brotli 압축 을 어떻게 구분 합 니까?
사이트 에서 Brotli 압축 을 사용 할 때 서버 가 머리 를 되 돌려 달라 고 요청 합 니 다.Content-Encoding 에는 br 글자 가 포함 되 어 있 습 니 다.그렇지 않 으 면 gzip 입 니 다.
오류 2:Fastest 단계 의 Brotli 압축 사용 하기
만약 마이크로소프트 공식 문서 나 다른 중국어 자원 을 읽 고 참고 했다 면,예 를 들 어:
   ASP.NET 코어 의 응답 압축 - MS Doc
   ASP.NET Core 에서 brotli 압축 사용 하기 - Cnblogs
그러면 코드 에서 아래 와 같이 압축 기능 을 사용 할 수 있 습 니 다.
쓰기 1:기본 압축 동작 사용 하기(프레임 워 크 는 Brotli 와 Gzip 기능 을 암시 적 으로 추가 합 니 다)

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}
쓰기 2:압축 기능 추가

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}
쓰기 3:사용자 정의 BrotliCompassionProvider

public class BrotliCompressionProvider : ICompressionProvider
{
    public string EncodingName => "br";
    public bool SupportsFlush => true
    public Stream CreateStream(Stream outputStream)
    {
           return new BrotliStream(outputStream,CompressionLevel.Fastest);
    }
}
불 행 히 도 상기 세 가지 표기 법 은 모두 Brotil 압축 알고리즘 의 장점 을 발휘 하지 못 했다.
이들 의 공통점 은 모두 Compression Level.Fastest 압축 단 계 를 사용 했다 는 것 이다.
반면 Compression Level.Fastest 등급 에 서 는 Brotil 과 Gzip 의 압축 성능 이 거의 다 릅 니 다.
참고:Introducing Support for Brotli Compression

그림 2-1 Fastest 모드 에서 세 가지 알고리즘 의 압축 률 은 같다.
오류 3:Optimal 급 Brotli 압축 사용
Compression Level 은 세 개의 매 거 진 값 만 있 습 니 다:Fastest/NoCompression/Optimal.
Fastest 등급 이 소 용이 없 으 니 우 리 는 Optimal 로 바 꿀 수 밖 에 없다.

그림 3-1 압축 단계 매 거
불 행 히 도 브 로 틸 의 옵 티 머 스 압축 단 계 는 심각 한 성능 문제 가 있어 실제 사이트 애플 리 케 이 션 에 적용 되 는 장면 이 거의 없다.

그림 3-2 최적화 압축 소모 시간 대비
최 적 실천:4 또는 5 단계 의 Brotli 압축 사용
4Introducing Support for Brotli Compression이 글 에서 작 가 는 서로 다른 등급 의 Brotil 의 압축 시간 에 대해 평 가 를 했다.즉,아래 의 그림 이다.

그림 4-1 서로 다른 압축 단계 에서 Brotli 의 압축 시간 소모
이 그림 을 살 펴 보면 Brotil 의 압축 품질 은 사실 1~11 개의 등급 이 있다.
브 로 틀 리 의 압축 단 계 를 어떻게 정의 합 니까?정 답 은 단계 에 대응 하 는 정 수 를 Compression Level 로 직접 바 꾸 는 것 입 니 다.
참고:Setting a specific Brotli compression level when using response compression in ASP.NET Core

그림 4-2 Brotli 의 압축 단 계 를 지정 합 니 다.
비록 이런 표기 법 은 매우 기괴 해 보이 지만.NET 소스 코드 를 고찰 함으로써 이런 표기 법 이 가능 하 다 는 것 을 확실히 알 수 있다.
참고:System.IO.Compression.BrotliUtils.cs

그림 4-3 Compression Level 매 거 진 강제 변환 정수
이제 우 리 는 압축 단 계 를 사용자 정의 할 수 있 지만 위의 소스 코드 를 주의 하 십시오.3 이상 의 단 계 를 지정 할 수 있 습 니 다.3 은 3 이하 의 값 을 포함 하여 다른 대응 하 는 변환 논리 가 있 습 니 다.
이 절의 첫 번 째 그림 4-1 로 돌아 가 실측 을 통 해 4/5 단계 에서 Brotli 는 가장 좋 은 압축 률 과 비교적 낮은 압축 손실 을 얻 을 수 있 음 을 발견 했다.
총결산
ASP.NET Core 에 서 는 Gzip 과 Brotil 압축 기능 을 동시에 사용 해 야 합 니 다.그 중에서 Brotil 의 압축 단 계 는 4 또는 5 로 사용자 정의 해 야 합 니 다.

public void ConfigureServices(IServiceCollection services)
        {
            services.AddResponseCompression(options =>
            {
                options.Providers.Add<BrotliCompressionProvider>();
                options.Providers.Add<GzipCompressionProvider>();
                options.MimeTypes =
                    ResponseCompressionDefaults.MimeTypes.Concat(
                        new[] { "image/svg+xml" });
            });

            services.Configure<BrotliCompressionProviderOptions>(options =>
            {
                options.Level = (CompressionLevel)4; // 4 or 5 is OK
            });
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCompression();
        }
이상 은 ASP.NET Core 파일 압축 의 가장 좋 은 실천 에 대한 상세 한 내용 입 니 다.ASP.NET Core 파일 압축 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기