다음을 통해 공유


ASP.NET Core 호스트 및 배포 Blazor WebAssembly

비고

이 문서의 최신 버전은 아닙니다. 현재 버전을 보려면 이 문서의 .NET 9 버전 을 참조하십시오.

경고

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 버전을 보려면 이 문서의 .NET 9 버전 을 참조하십시오.

중요합니다

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.

현재 버전을 보려면 이 문서의 .NET 9 버전 을 참조하십시오.

이 문서에서는 Blazor WebAssembly 앱을 호스트하고 배포하는 방법을 설명합니다.

Blazor WebAssembly 호스팅 모델을 사용하면 다음과 같이 실행됩니다.

  • Blazor 앱, 해당 앱의 종속성 및 .NET 런타임이 병렬로 브라우저에 다운로드됩니다.
  • 해당 앱은 브라우저 UI 스레드에서 직접 실행됩니다.

이 문서는 앱이 Blazor 정적 호스팅 웹 서버 또는 서비스에 배치되는 배포 시나리오와 관련이 있습니다. .NET은 앱을 제공하는 Blazor 데 사용되지 않습니다. 이 전략은 독립 실행형 배포 섹션 및 IIS, Azure 서비스, Apache, Nginx 및 GitHub Pages에 대한 이 노드의 다른 문서에서 다룹니다.

다음 배포 전략이 지원됩니다.

  • Blazor 앱은 ASP.NET Core 앱에서 제공됩니다. 이 전략은 ASP.NET Core를 사용하여 호스트된 배포 섹션에서 설명합니다.
  • Blazor 앱은 정적 호스팅 웹 서버 또는 서비스에 배치되며, 이 경우 Blazor 앱을 처리하기 위해 .NET을 사용하지 않습니다. 이 전략은 IIS 하위 앱으로 앱을 호스트하는 방법에 대한 정보를 포함하는 독립형 배포 섹션에서 설명합니다.
  • ASP.NET Core 앱은 여러 개의 Blazor WebAssembly 앱을 호스트합니다. 자세한 내용은 호스트된 여러 ASP.NET Core Blazor WebAssembly 앱을 참조하세요.

하위 도메인 및 IIS 하위 애플리케이션 호스팅

하위 도메인 호스팅에는 앱의 특별한 구성이 필요하지 않습니다. 앱을 하위 도메인에서 호스팅하기 위해 앱 기본 경로( 태그가 내에 있음)를 구성할 필요가 없습니다.

IIS 하위 애플리케이션 호스팅 사용하려면 앱 기본 경로를 설정해야 합니다. IIS 하위 애플리케이션 호스팅에 대한 추가 지침에 대한 자세한 내용 및 교차 링크는 ASP.NET Core Blazor호스트 및 배포를 참조하세요.

일부 모바일 디바이스 브라우저의 최대 힙 크기 감소

클라이언트(Blazor또는 독립 실행형 .Client 앱의 프로젝트)에서 실행되고 모바일 디바이스 브라우저, 특히 iOS의 Blazor Web App Safari를 대상으로 하는 앱을 빌드 Blazor WebAssembly 할 때 MSBuild 속성을 EmccMaximumHeapSize 사용하여 앱의 최대 메모리를 줄여야 할 수 있습니다. 기본값은 2,147,483,648바이트이며, 이 값이 너무 큰 경우 앱이 추가 메모리 할당을 시도하지만 브라우저가 이를 허용하지 않으면 앱 충돌이 발생할 수 있습니다. 다음 예제에서는 파일의 값을 268,435,456바이트로 Program 설정합니다.

모바일 디바이스 브라우저, 특히 iOS의 Safari를 대상으로 하는 앱을 빌드 Blazor WebAssembly 할 때 MSBuild 속성을 EmccMaximumHeapSize 사용하여 앱의 최대 메모리를 줄여야 할 수 있습니다. 기본값은 2,147,483,648바이트이며, 이 값이 너무 큰 경우 앱이 추가 메모리 할당을 시도하지만 브라우저가 이를 허용하지 않으면 앱 충돌이 발생할 수 있습니다. 다음 예제에서는 파일의 값을 268,435,456바이트로 Program 설정합니다.

<EmccMaximumHeapSize>268435456</EmccMaximumHeapSize>

Mono/WebAssembly MSBuild 속성 및 대상에 대한 자세한 내용은 ( GitHub 리포지토리)를 참고하세요.

.NET 어셈블리를 위한 Webcil 패키징 형식

웹빌 은 제한적인 네트워크 환경에서 사용하도록 Blazor WebAssembly 설계된 .NET 어셈블리에 대한 웹 친화적인 패키징 형식입니다. 웹빌 파일은 표준 WebAssembly 래퍼를 사용합니다. 여기서 어셈블리는 표준 .wasm 파일 확장자를 사용하는 WebAssembly 파일로 배포됩니다.

Webcil은 Blazor WebAssembly 앱을 게시할 때 기본 포장 형식입니다. 웹실 사용을 사용하지 않도록 설정하려면 앱의 프로젝트 파일에서 다음 MSBuild 속성을 설정합니다.

<PropertyGroup>
  <WasmEnableWebcil>false</WasmEnableWebcil>
</PropertyGroup>

부팅 리소스를 로드하는 방법 사용자 지정

loadBootResource API를 사용하여 부팅 리소스를 로드하는 방법 사용자 지정 자세한 내용은 ASP.NET Core Blazor 시작을 참조하세요.

압축

Blazor WebAssembly 앱이 게시될 때 게시하는 도중에 출력을 정적으로 압축하여 앱의 크기를 줄이고 런타임 압축의 오버헤드를 제거합니다. 다음 압축 알고리즘이 사용됩니다.

Blazor 는 호스트를 사용하여 적절한 압축 파일을 제공합니다. Blazor WebAssembly 독립 실행형 앱을 호스트하는 경우 정적으로 압축된 파일이 제공되도록 추가 작업이 필요할 수도 있습니다.

Blazor 는 호스트를 사용하여 적절한 압축 파일을 제공합니다. ASP.NET Core 호스트Blazor WebAssembly 프로젝트를 사용하는 경우 호스트 프로젝트는 콘텐츠 협상을 수행하고 정적으로 압축된 파일을 제공할 수 있습니다. Blazor WebAssembly 독립 실행형 앱을 호스트하는 경우 정적으로 압축된 파일이 제공되도록 추가 작업이 필요할 수도 있습니다.

  • IIS web.config 압축 구성의 경우 IIS: Brotli 및 Gzip 압축 섹션을 참조하세요.
  • 정적으로 압축된 파일 콘텐츠 협상을 지원하지 않는 정적 호스팅 솔루션을 호스팅하는 경우 Brotli 압축 파일을 가져오고 디코딩하도록 앱을 구성하는 것이 좋습니다.

JavaScript Brotli 디코더를 GitHub 리포지토리에서 가져옵니다. 축소된 디코더 파일은 이름이 decode.min.js이며 리포지토리의 js 폴더에 있습니다.

비고

decode.js 스크립트(decode.min.js)의 축소된 버전이 실패하는 경우 축소 해제한 버전(decode.js)을 대신 사용해 보세요.

디코더를 사용하도록 앱을 업데이트합니다.

wwwroot/index.html 파일의 autostartfalse 태그에서 Blazor를 <script>로 설정합니다.

<script src="_framework/blazor.webassembly.js" autostart="false"></script>

Blazor'의 <script> 태그 뒤와 닫는 </body> 태그 앞에 다음 JavaScript 코드 <script> 블록을 추가합니다. 다음 함수는 브라우저의 캐시를 업데이트된 상태로 유지하기 위해 fetchcache: 'no-cache' 호출합니다.

Blazor Web App:

<script type="module">
  import { BrotliDecode } from './decode.min.js';
  Blazor.start({
    webAssembly: {
      loadBootResource: function (type, name, defaultUri, integrity) {
        if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration' && type !== 'manifest') {
          return (async function () {
            const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
            if (!response.ok) {
              throw new Error(response.statusText);
            }
            const originalResponseBuffer = await response.arrayBuffer();
            const originalResponseArray = new Int8Array(originalResponseBuffer);
            const decompressedResponseArray = BrotliDecode(originalResponseArray);
            const contentType = type === 
              'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
            return new Response(decompressedResponseArray, 
              { headers: { 'content-type': contentType } });
          })();
        }
      }
    }
  });
</script>

독립 실행형 Blazor WebAssembly:

<script type="module">
  import { BrotliDecode } from './decode.min.js';
  Blazor.start({
    loadBootResource: function (type, name, defaultUri, integrity) {
      if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration') {
        return (async function () {
          const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
          if (!response.ok) {
            throw new Error(response.statusText);
          }
          const originalResponseBuffer = await response.arrayBuffer();
          const originalResponseArray = new Int8Array(originalResponseBuffer);
          const decompressedResponseArray = BrotliDecode(originalResponseArray);
          const contentType = type === 
            'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
          return new Response(decompressedResponseArray, 
            { headers: { 'content-type': contentType } });
        })();
      }
    }
  });
</script>

부팅 리소스를 로드하는 방법에 대한 자세한 내용은 ASP.NET Core Blazor 시작을 참조하세요.

압축을 해제하려면 앱의 프로젝트 파일에 CompressionEnabled MSBuild 속성을 추가하고 값을 false로 설정합니다.

<PropertyGroup>
  <CompressionEnabled>false</CompressionEnabled>
</PropertyGroup>

명령 셸에서 다음 구문을 사용하여 CompressionEnabled 속성을 dotnet publish 명령에 전달할 수 있습니다.

dotnet publish -p:CompressionEnabled=false

압축을 해제하려면 앱의 프로젝트 파일에 BlazorEnableCompression MSBuild 속성을 추가하고 값을 false로 설정합니다.

<PropertyGroup>
  <BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>

명령 셸에서 다음 구문을 사용하여 BlazorEnableCompression 속성을 dotnet publish 명령에 전달할 수 있습니다.

dotnet publish -p:BlazorEnableCompression=false

올바른 라우팅을 위해 URL 다시 생성

Blazor WebAssembly 앱의 페이지 구성 요소에 대한 라우팅 요청은 Blazor Server 앱에서의 요청 라우팅만큼 간단하지 않습니다. 다음 두 구성 요소를 사용하는 Blazor WebAssembly 앱을 살펴보겠습니다.

  • Main.razor: 앱의 루트에 로드되고 About 구성 요소에 대한 링크가 href="About"에 포함됩니다.
  • About.razor: About 구성 요소입니다.

브라우저의 주소 표시줄을 사용하여 앱의 기본 문서를 요청하는 경우(예: https://www.contoso.com/):

  1. 브라우저가 요청을 합니다.
  2. 기본 페이지(일반적으로 index.html)가 반환됩니다.
  3. index.html이 앱을 부트스트랩합니다.
  4. Router 구성 요소가 로드되고 RazorMain 구성 요소가 렌더링됩니다.

About 라우터는 브라우저가 인터넷에서 Blazor으로 www.contoso.com을 요청하는 것을 중단하고 렌더링된 About 구성 요소를 직접 제공하므로 기본 페이지에서 About 구성 요소에 대한 링크 선택은 클라이언트에서 작동합니다. Blazor WebAssembly 앱 내의 내부 엔드포인트에 대한 모든 요청도 같은 방법으로 작동합니다. 요청은 인터넷상에서 서버가 호스트하는 리소스에 대한 브라우저 기반 요청을 트리거하지 않습니다. 라우터가 내부적으로 요청을 처리합니다.

브라우저의 주소 표시줄을 사용하여 www.contoso.com/About을 요청하면 해당 요청이 실패합니다. 앱의 인터넷 호스트에 해당 리소스가 없으므로 404 - 찾을 수 없음 응답이 반환됩니다.

브라우저는 인터넷 기반 호스트에 클라이언트 쪽 페이지를 요청하므로, 웹 서버 및 호스팅 서비스는 서버에 실제로 존재하지 않는 리소스에 대한 모든 요청을 index.html 페이지에 다시 써야 합니다. index.html이 반환되는 경우 앱의 Blazor 라우터가 넘겨받아 올바른 리소스로 응답합니다.

IIS 서버에 배포하는 경우 앱의 게시된 web.config 파일과 함께 URL 재작성 모듈을 사용할 수 있습니다. 자세한 내용은 IIS를 사용하여 ASP.NET Core Blazor WebAssembly 호스트 및 배포를 참조하세요.

ASP.NET Core를 사용하여 호스트된 배포

'호스트된 배포'는 웹 서버에서 실행되는 ASP.NET Core 앱을 통해 Blazor WebAssembly 앱을 브라우저에 제공합니다.

클라이언트 Blazor WebAssembly 앱이 서버 앱의 /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot 폴더에 서버 앱의 다른 정적 웹 자산과 함께 게시됩니다. 두 앱이 함께 배포됩니다. ASP.NET Core 앱을 호스트할 수 있는 웹 서버가 필요합니다. 호스트된 배포의 경우 Visual Studio는 Blazor WebAssembly 명령을 사용하는 경우 템플릿을 포함하는 blazorwasm 프로젝트 템플릿 및 dotnet new 명령을 사용하는 경우 Hosted 옵션이 선택된 -ho|--hosted를 포함합니다.

자세한 내용은 다음 문서를 참조하세요.

특정 플랫폼에 대한 프레임워크 종속 실행 파일의 호스팅된 배포

호스트된 Blazor WebAssembly 앱을 특정 플랫폼에 대해 프레임워크에 의존하는 실행 파일로 배포하려면(자체 포함되지 않음), 사용 중인 도구에 따라 다음 지침을 따르십시오.

비주얼 스튜디오

자체 포함 배포는 생성된 게시 프로필(.pubxml)에 대해 구성됩니다. Server 프로젝트의 게시 프로필에 <SelfContained>(으)로 설정된 false MSBuild 속성이 포함되어 있는지 확인합니다.

.pubxml 프로젝트의 Server 폴더에 있는 Properties 게시 프로필 파일에서:

<SelfContained>false</SelfContained>

게시 UI의 설정 영역에서 대상 런타임 설정을 사용하여 런타임 식별자 (RID)를 설정하면, 게시 프로필에 <RuntimeIdentifier> MSBuild 속성이 생성됩니다.

<RuntimeIdentifier>{RID}</RuntimeIdentifier>

위의 구성에서 {RID} 자리 표시자는 런타임 식별자(RID)입니다.

Server 구성에서 프로젝트를 게시합니다.

비고

/p:PublishProfile={PROFILE}을(를) dotnet publish 명령({PROFILE} 자리 표시자가 프로파일임)에 전달하여 .NET CLI를 사용하여 게시 프로필 설정으로 앱을 게시할 수 있습니다. 자세한 내용은 ASP.NET Core 앱 배포 문서에 대한 Visual Studio 게시 프로필(.pubxml)의 게시 프로필폴더 게시 예제 섹션을 참조하세요. 명령에서 RID를 전달하고 게시 프로필에서 전달하지 않는 경우 옵션이 아닌 명령과 함께 MSBuild 속성()을 사용합니다.

.NET CLI (.NET 명령줄 인터페이스)

프로젝트의 프로젝트 파일에서 <SelfContained><PropertyGroup> MSBuild 속성을 배치하여 Server 배포를 false로 설정합니다.

<SelfContained>false</SelfContained>

중요합니다

SelfContained 속성은 Server 프로젝트의 프로젝트 파일에 배치해야 합니다. dotnet publish 명령어의 옵션 또는 MSBuild 속성 --no-self-contained을(를) 사용하여 속성을 올바르게 설정할 수 없습니다.

다음 접근 방식 중 하나를 사용하여 RID(런타임 식별자)를 설정합니다.

  • 프로젝트의 프로젝트 파일 <PropertyGroup>에서 Server의 RID를 설정하는 옵션 1:

    <RuntimeIdentifier>{RID}</RuntimeIdentifier>
    

    위의 구성에서 {RID} 자리 표시자는 런타임 식별자(RID)입니다.

    Server 프로젝트의 릴리스 구성에서 앱을 게시합니다.

    dotnet publish -c Release
    
  • 옵션 2: dotnet publish 옵션이 아닌 MSBuild 속성()으로 명령/p:RuntimeIdentifier를 전달합니다.

    dotnet publish -c Release /p:RuntimeIdentifier={RID}
    

    이전 명령에서 {RID} 자리 표시자는 런타임 식별자(RID)입니다.

자세한 내용은 다음 문서를 참조하세요.

독립 실행형 배포

‘독립 실행형 배포’는 앱을 클라이언트가 직접 요청하는 정적 파일 세트로 제공합니다.Blazor WebAssembly 모든 정적 파일 서버는 Blazor 앱을 사용할 수 있습니다.

독립 실행형 배포 자산은 /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot 자리 표시자가 대상 프레임워크인 bin/Release/{TARGET FRAMEWORK}/browser-wasm/publish 또는 {TARGET FRAMEWORK} 폴더에 게시됩니다.

Azure App Service

Blazor WebAssembly 앱을 IIS에서 앱을 호스트하는 Windows의 Azure App Services에 배포할 수 있습니다.

Linux용 Azure App Service에 독립 실행형 Blazor WebAssembly 앱 배포는 현재 지원되지 않습니다. 이 시나리오를 지원하는 Blazor WebAssembly를 사용하여 독립 실행형 앱을 호스팅하는 것이 좋습니다.

독립 실행형 Docker

독립 실행형 Blazor WebAssembly 앱은 정적 파일 서버에서 호스팅하기 위한 정적 파일 집합으로 게시됩니다.

Docker에서 앱을 호스트하려면 다음을 수행합니다.

  • Nginx 또는 Apache와 같은 웹 서버 지원이 있는 Docker 컨테이너를 선택합니다.
  • 정적 파일을 제공하기 위해 웹 서버에 정의된 위치 폴더에 publish 폴더 자산을 복사합니다.
  • 필요에 따라 추가 구성을 적용하여 Blazor WebAssembly 앱을 제공합니다.

구성 지침은 다음 리소스를 참조하세요.

호스트 구성 값

Blazor WebAssembly 앱은 개발 환경의 런타임에 다음 호스트 구성 값을 명령줄 인수로 허용할 수 있습니다.

콘텐츠 루트

--contentroot 인수는 앱의 콘텐츠 파일을 포함하는 디렉터리(콘텐츠 루트)에 대한 절대 경로를 설정합니다. 다음 예제에서 /content-root-path는 앱의 콘텐츠 루트 경로입니다.

  • 명령 프롬프트에서 앱을 로컬로 실행할 때 인수를 전달합니다. 앱의 디렉터리에서 다음을 실행합니다.

    dotnet watch --contentroot=/content-root-path
    
  • launchSettings.json 프로필의 앱 파일에 항목을 추가합니다. 이 설정은 Visual Studio 디버거 및 명령 프롬프트 dotnet watch (또는 dotnet run)를 사용하여 앱을 실행할 때 사용됩니다.

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • Visual Studio의 속성>디버그>애플리케이션 인수에서 인수를 지정합니다. Visual Studio 속성 페이지에서 인수를 설정하면 해당 인수가 launchSettings.json 파일에 추가됩니다.

    --contentroot=/content-root-path
    

경로 기준

--pathbase 인수는 루트가 아닌 상대 URL 경로를 사용하여 로컬로 앱을 실행하기 위한 앱 기본 경로를 설정합니다. (준비 및 프로덕션의 경우 <base> 태그 href/ 이외의 경로로 설정됩니다.) 다음 예제에서 /relative-URL-path는 앱의 경로 기준입니다. 자세한 내용은 ASP.NET Core Blazor 앱 기본 경로를 참조하세요.

중요합니다

href 태그의 <base>에 대해 제공되는 경로와 달리 / 인수 값을 전달할 때 뒤에 슬래시(--pathbase)를 포함하지 않습니다. 앱 기본 경로가 <base> 태그에 <base href="/CoolApp/">로 제공되는 경우(뒤에 슬래시 포함) 명령줄 인수 값을 --pathbase=/CoolApp로 전달합니다(뒤에 슬래시 없음).

  • 명령 프롬프트에서 앱을 로컬로 실행할 때 인수를 전달합니다. 앱의 디렉터리에서 다음을 실행합니다.

    dotnet watch --pathbase=/relative-URL-path
    
  • launchSettings.json 프로필의 앱 파일에 항목을 추가합니다. 이 설정은 Visual Studio 디버거 및 명령 프롬프트 dotnet watch (또는 dotnet run)를 사용하여 앱을 실행할 때 사용됩니다.

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • Visual Studio의 속성>디버그>애플리케이션 인수에서 인수를 지정합니다. Visual Studio 속성 페이지에서 인수를 설정하면 해당 인수가 launchSettings.json 파일에 추가됩니다.

    --pathbase=/relative-URL-path
    

자세한 내용은 ASP.NET Core Blazor 앱 기본 경로를 참조하세요.

URL들

--urls 인수는 요청을 수신하기 위한 포트 및 프로토콜을 포함하는 IP 주소 또는 호스트 주소를 설정합니다.

  • 명령 프롬프트에서 앱을 로컬로 실행할 때 인수를 전달합니다. 앱의 디렉터리에서 다음을 실행합니다.

    dotnet watch --urls=http://127.0.0.1:0
    
  • launchSettings.json 프로필의 앱 파일에 항목을 추가합니다. 이 설정은 Visual Studio 디버거 및 명령 프롬프트 dotnet watch (또는 dotnet run)를 사용하여 앱을 실행할 때 사용됩니다.

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • Visual Studio의 속성>디버그>애플리케이션 인수에서 인수를 지정합니다. Visual Studio 속성 페이지에서 인수를 설정하면 해당 인수가 launchSettings.json 파일에 추가됩니다.

    --urls=http://127.0.0.1:0
    

트리머를 구성하십시오

Blazor는 각 릴리스 빌드에 IL(중간 언어) 트리밍을 수행하여 출력 어셈블리에서 필요 없는 IL을 제거합니다. 자세한 내용은 ASP.NET Core Blazor용 트리머 구성을 참조하세요.

링커 구성 설정

Blazor는 각 릴리스 빌드에 대해 IL(중간 언어) 연결을 수행하여 출력 어셈블리에서 불필요한 IL을 제거합니다. 자세한 내용은 ASP.NET Core Blazor용 링커 구성을 참조하세요.

DLL 파일의 파일 이름 확장명 변경

이 섹션은 .NET 5~ .NET 7에 적용됩니다. .NET 8 이상에서는 .NET 어셈블리가 웹빌 파일 형식을 사용하여 WebAssembly 파일(.wasm)로 배포됩니다.

방화벽, 바이러스 백신 프로그램 또는 네트워크 보안 어플라이언스가 앱의 DLL(동적 연결 라이브러리) 파일(.dll)의 전송을 차단하는 경우 이 섹션의 지침에 따라 앱의 게시된 DLL 파일의 파일 이름 확장명을 변경할 수 있습니다.

앱 DLL 파일의 파일 이름 확장명을 변경하면 많은 보안 시스템이 파일 확장명을 확인하는 것이 아니라 앱 파일의 콘텐츠를 검사하기 때문에 문제가 해결되지 않을 수 있습니다.

DLL 파일의 다운로드 및 실행을 차단하는 환경에서 보다 강력한 접근 방식을 사용하려면 다음 방법 중 하나를 수행합니다.

  • .NET 8 이상을 사용하여 .NET 어셈블리를 .wasm 파일 형식으로 WebAssembly 파일()로 패키징합니다. 자세한 내용은 이 문서의 .NET 8 이상 버전에서 .NET 어셈블리에 대한 웹빌 패키징 형식 섹션을 참조하세요.
  • .NET 6 이상에서는 사용자 지정 배포 레이아웃을 사용합니다.

이 문제를 처리하기 위한 타사 접근 방식이 있습니다. 자세한 내용은 Awesome의 리소스를 참조하세요 Blazor.

앱을 게시한 후 셸 스크립트 또는 DevOps 빌드 파이프라인을 사용하여 얩의 게시된 출력의 디렉터리에서 다른 파일 확장명을 사용하도록 .dll 파일의 이름을 바꿉니다.

다음 예제에서:

  • PS(PowerShell)는 파일 확장자를 업데이트하는 데 사용됩니다.
  • .dll 파일의 이름이 명령줄에서 .bin 파일 확장명을 사용하도록 변경됩니다.
  • 부팅 매니페스트에 나열된 Blazor 파일은 .dll 파일 확장자에서 .bin 파일 확장자로 업데이트됩니다.
  • 서비스 작업자 자산도 사용 중인 경우 PowerShell 명령은 .dll파일에 나열된 service-worker-assets.js 파일을 .bin 파일 확장으로 업데이트합니다.

.bin 외 다른 파일 확장명을 사용하려면 다음 명령에서 .bin을(를) 원하는 파일 확장명으로 바꿉니다.

다음 명령어에서 {PATH} 자리 표시자는 publish 폴더 안에 게시된 폴더의 경로입니다.

폴더의 파일 확장명 이름 바꾸기:

dir {PATH} | rename-item -NewName { $_.name -replace ".dll\b",".bin" }

파일의 파일 확장명 blazor.boot.json 이름 바꾸기:

((Get-Content {PATH}\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\blazor.boot.json

앱이 PWA(프로그레시브 웹앱)이므로 서비스 작업자 자산도 사용 중인 경우:

((Get-Content {PATH}\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\service-worker-assets.js

앞의 명령에서 {PATH} 자리 표시자는 게시된 service-worker-assets.js 파일의 경로입니다.

압축 blazor.boot.json 된 파일의 주소를 지정하려면 다음 방법 중 하나를 채택합니다.

  • 업데이트 blazor.boot.json 된 파일을 다시 압축하여 새 blazor.boot.json.gz 파일과 blazor.boot.json.br 파일을 생성합니다. (권장)
  • 압축된 blazor.boot.json.gzblazor.boot.json.br 파일을 제거합니다. (이 방법으로 압축을 사용할 수 없습니다.)

PWA(프로그레시브 웹앱)의 압축 service-worker-assets.js 파일의 경우 다음 방법 중 하나를 채택합니다.

  • 업데이트 service-worker-assets.js 된 파일을 다시 압축하여 새 service-worker-assets.js.br 파일과 service-worker-assets.js.gz 파일을 생성합니다. (권장)
  • 압축된 service-worker-assets.js.gzservice-worker-assets.js.br 파일을 제거합니다. (이 방법으로 압축을 사용할 수 없습니다.)

.NET 6/7의 Windows에서 확장 변경을 자동화하기 위해 다음 방법은 프로젝트의 루트에 배치된 PowerShell 스크립트를 사용합니다. 압축을 사용하지 않도록 설정하는 다음 스크립트는 앱이 blazor.boot.json인 경우 파일 및 service-worker-assets.js 파일을 다시 압축 하려는 경우 추가 수정을 위한 기초입니다. 폴더의 publish 경로는 실행될 때 스크립트에 전달됩니다.

ChangeDLLExtensions.ps1::

param([string]$filepath)
dir $filepath\wwwroot\_framework | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.gz
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.br

앱이 PWA(프로그레시브 웹앱)이므로 서비스 작업자 자산도 사용 중인 경우 다음 명령을 추가합니다.

((Get-Content $filepath\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\service-worker-assets.js
Remove-Item $filepath\wwwroot\service-worker-assets.js.gz
Remove-Item $filepath\wwwroot\service-worker-assets.js.br

프로젝트 파일에서 스크립트는 Release 구성에 대한 앱을 게시한 후에 실행됩니다.

<Target Name="ChangeDLLFileExtensions" AfterTargets="AfterPublish" Condition="'$(Configuration)'=='Release'">
  <Exec Command="powershell.exe -command &quot;&amp; {.\ChangeDLLExtensions.ps1 '$(SolutionDir)'}&quot;" />
</Target>

앱을 게시한 후 blazor.boot.jsonservice-worker-assets.js을 사용하는 경우, 수동으로 압축을 다시 활성화하세요.

비고

동일한 어셈블리의 이름을 변경하고 지연 로드하는 경우 ASP.NET Core Blazor WebAssembly에서 어셈블리 지연 로드의 지침을 참조하세요.

일반적으로 앱의 서버는 업데이트된 확장 프로그램을 사용하여 파일을 제공하기 위해 정적 자산 구성이 필요합니다. IIS에서 호스트하는 앱의 경우, 사용자 지정 <mimeMap> 파일의 정적 콘텐츠 섹션(<staticContent>)에서 새 파일 확장명용 MIME 맵 항목(web.config)을 추가합니다. 다음 예제에서는 파일 확장명은 .dll에서 .bin로 변경된 것으로 가정합니다.

<staticContent>
  ...
  <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
  ...
</staticContent>

압축이 사용 중인 경우 압축된 파일에 대한 업데이트를 포함합니다.

<mimeMap fileExtension=".bin.br" mimeType="application/octet-stream" />
<mimeMap fileExtension=".bin.gz" mimeType="application/octet-stream" />

.dll 파일 확장 프로그램에 대한 항목을 제거합니다.

- <mimeMap fileExtension=".dll" mimeType="application/octet-stream" />

`.dll` 압축 파일에 대한 항목을 제거합니다. 단, 압축이 사용 중인 경우에 한합니다.

- <mimeMap fileExtension=".dll.br" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dll.gz" mimeType="application/octet-stream" />

사용자 지정 파일에 대한 자세한 내용은 web.configweb.config 섹션의 사용을 참조하세요.

이전 배포 시의 손상

일반적으로 배포 시 다음 현상이 나타납니다.

  • 변경된 파일만 대체되어 일반적으로 배포 속도가 빨라집니다.
  • 새 배포에 포함되지 않은 기존 파일은 새 배포에서 사용할 수 있도록 남아 있습니다.

드문 경우에 이전 배포에서 남은 파일 때문에 새 배포가 손상될 수 있습니다. 기존 배포(또는 배포 전에 로컬로 게시된 앱)를 완전히 삭제하면 손상된 배포와 관련된 문제가 해결될 수 있습니다. 종종 기존 배포를 한번 삭제하면 DevOps 빌드 및 배포 파이프라인을 포함하는 문제를 해결할 수 있습니다.

DevOps 빌드 및 배포 파이프라인을 사용할 때 항상 이전 배포를 지워야 하는 경우 손상의 정확한 원인을 해결할 때까지 새 배포마다 이전 배포를 삭제하는 단계를 빌드 파이프라인에 일시적으로 추가할 수 있습니다.