ASP.NET Core 에서 정적 파일 을 미리 압축 하 는 방법 절차

머리말
웹 응용 프로그램의 최 적 화 는 매우 중요 하 다.왜냐하면 더 적은 CPU 를 사용 하고 더 적은 대역 폭 을 차지 하면 프로젝트 의 비용 을 줄 일 수 있 기 때문이다.ASP.NET Core 에 서 는 응답 압축 을 쉽게 사용 할 수 있 지만,예비 압축 파일 에 대해 서 는 추가 적 인 기능 이 필요 합 니 다.이 블 로그 글 은 ASP.NET Core 에서 정적 파일 을 미리 압축 하 는 방법 을 보 여 준다.
다음은 더 이상 할 말 이 없 으 니 상세 한 소 개 를 살 펴 봅 시다.
왜 파일 을 미리 압축 해 야 합 니까?
서버 에서 파일 을 요청 할 때,우 리 는 동적 으로 파일 을 압축 할 수 있 지만,이것 은 웹 서버 가 더 많은 추가 작업 을 해 야 한 다 는 것 을 의미한다.사실 새로운 프로그램 이 배 치 될 때 만 압축 할 파일 을 변경 할 수 있 습 니 다.압축 효과 가 좋 을 수록 CPU 가 해 야 할 일이 많아 집 니 다.
이 사실은 우리 로 하여 금 반복 적 으로 압축 하지 않 은 상태 에서 이 파일 들 을 제공 할 수 있 는 지 의문 을 가지 게 한다.다행히도 이 문제 의 답 은 긍정 적 이다.-그래,우 리 는 ASP.NET Core 에서 정적 파일 중간 부품 을 확장 해서 이 점 을 할 수 있다.
사전 압축 파일 만 들 기
전체 프레젠테이션 을 가능 한 한 간단하게 하기 위해 서,우 리 는 7-Zip 을 사용 하여 디스크 의 정적 파일 을 압축 할 수 있다.다음은 기본 ASP.NET Core MVC 프로그램의 site.css 파일 을 압축 할 때 7-Zip 대화 상자 창 입 니 다.
여기 서 내 가 Ultra 압축 을 사용 한 것 을 알 수 있 을 것 이다.이것 은 분명히 우리 가 웹 서버 에서 동적 으로 압축 하 기 를 원 하 는 방법 이 아니다.왜냐하면 그것 은 CPU 를 너무 소모 하기 때문이다.
정상 적 인 상황 에서 여 기 는 Gulp 를 사용 하여 파일 을 묶 고 수축 하 는 기능 을 완성 할 수 있 으 며 본 고 는 당분간 이것 을 소개 하지 않 을 것 이다.
압축 파일 제공
여기 서 나 는 Stack Overflow 상의 간단 한 해결 방안(How to gzip static content in ASP.NET Core in a self host environment.을 참고 했다.자 바스 크 립 트 와 CSS 파일 을 처 리 했 습 니 다.

app.UseStaticFiles(new StaticFileOptions
{
  OnPrepareResponse = context =>
  {
    IHeaderDictionary headers = context.Context.Response.Headers;
    string contentType = headers["Content-Type"];
    if (contentType == "application/x-gzip")
    {
      if (context.File.Name.EndsWith("js.gz"))
      {
        contentType = "application/javascript";
      }
      else if (context.File.Name.EndsWith("css.gz"))
      {
        contentType = "text/css";
      }
      headers.Add("Content-Encoding", "gzip");
      headers["Content-Type"] = contentType;
    }
  }
});
물론 자 바스 크 립 트 와 CSS 파일 은 유일 하 게 압축 해 야 할 파일 형식 이 아니다.그 러 니까 여기 콘 텐 츠 타 입 을 죽 이면 안 돼.여기 서 나 는.NET Core Tutorials 사이트 에서 제공 하 는 해결 방안Getting A Mime Type From A File Name In .NET Core을 채택 했다.나 에 게 있어 서 이 방안 은 이미 충분히 간단 하 다.

var provider = new FileExtensionContentTypeProvider();
string contentType;
if (!provider.TryGetContentType(fileName, out contentType))
{
  contentType = "application/octet-stream";
}
여기 서 나 는 두 가지 방안 을 합 쳐 최종 해결 방안 을 만 들 었 다.

var mimeTypeProvider = new FileExtensionContentTypeProvider();
 
app.UseStaticFiles(new StaticFileOptions
{
  OnPrepareResponse = context =>
  {
    var headers = context.Context.Response.Headers;
    var contentType = headers["Content-Type"];
 
    if (contentType != "application/x-gzip" && !context.File.Name.EndsWith(".gz"))
    {
      return;
    }
 
    var fileNameToTry = context.File.Name.Substring(0, context.File.Name.Length - 3);
 
    if (mimeTypeProvider.TryGetContentType(fileNameToTry, out var mimeType))
    {
      headers.Add("Content-Encoding", "gzip");
      headers["Content-Type"] = mimeType;
    }
  }
});
이로써 상기 코드 를 사용 하면 본문의 주 제 는 해결 된다.
기 존 라 이브 러 리 를 직접 사용 하려 는 개발 자 에 게 는 Nuget 을 이용 해 Peter Andersson 이 만 든 미들웨어 를 직접 다운로드 할 수 있다.
Install-Package CompressedStaticFiles -Version 1.0.4
총결산
사전 압축 파일 을 사용 하 는 것 은 웹 개발 의 주류 가 아니 지만 CPU 와 대역 폭 을 절약 할 수 있다.압축 정적 파일 은 ASP.NET Core 응용 프로그램 으로 구축 할 수 있 는 단계 입 니 다.비록 ASP.NET Core 가 상 자 를 열 면 예비 압축 파일 을 지원 하지 않 지만,우 리 는 정적 파일 중간 부품 을 확장 하여 예비 압축 파일 을 지원 할 수 있 습 니 다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기