Compartilhar via


Hospedar e implantar o ASP.NET Core Blazor WebAssembly

Observação

Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a versão .NET 9 deste artigo.

Aviso

Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte a Política de Suporte do .NET e do .NET Core. Para informações sobre a versão vigente, confira a versão .NET 9 deste artigo.

Importante

Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Para informações sobre a versão vigente, confira a versão .NET 9 deste artigo.

Este artigo explica como hospedar e implantar aplicativos Blazor WebAssembly.

Com o modelo de hospedagem Blazor WebAssembly:

  • O aplicativo Blazor, suas dependências e o tempo de execução do .NET são baixados no navegador em paralelo.
  • O aplicativo é executado diretamente no thread da interface do usuário do navegador.

Este artigo refere-se ao cenário de implantação no qual o aplicativo Blazor é colocado em um servidor Web ou serviço de hospedagem estática e o .NET não é utilizado para servir o aplicativo Blazor. Essa estratégia é abordada na seção de implantação autônoma e em outros artigos neste nó para IIS, serviços do Azure, Apache, Nginx e GitHub Pages.

Há suporte para as seguintes estratégias de implantação:

  • O aplicativo do Blazor é executado por um aplicativo ASP.NET Core. Esta estratégia é abordada na seção Implantação hospedada com o ASP.NET Core.
  • O aplicativo do Blazor é colocado em um serviço ou um servidor Web de hospedagem estático, em que o .NET não é usado para atender ao aplicativo do Blazor. Essa estratégia é abordada na seção Implantação autônoma, que inclui informações sobre como hospedar um aplicativo do Blazor WebAssembly como subaplicativo do IIS.
  • Um aplicativo do ASP.NET Core hospeda vários aplicativos do Blazor WebAssembly. Para obter mais informações, confira Vários aplicativos Blazor WebAssembly do ASP.NET Core hospedados.

Hospedagem de subdomínio e sub-aplicativo do IIS

A hospedagem de subdomínio não requer uma configuração especial do aplicativo. Você não precisa configurar o caminho básico do aplicativo (a tag <base> no wwwroot/index.html) para hospedar o aplicativo em um subdomínio.

A hospedagem do sub-aplicativo do IIS requer que você defina o caminho básico do aplicativo. Para obter mais informações e links cruzados para orientações adicionais sobre a hospedagem de subaplicativos no IIS, veja Hospedar e implantar aplicativos no ASP.NET CoreBlazor.

Diminuir o tamanho máximo do heap para alguns navegadores de dispositivo móvel

Ao criar um aplicativo Blazor que é executado no cliente (projeto .Client de um Blazor Web App ou aplicativo Blazor WebAssembly autônomo) e destina-se a navegadores de dispositivo móvel, especialmente o Safari no iOS, pode ser necessário diminuir a memória máxima do aplicativo com a propriedade MSBuild EmccMaximumHeapSize. O valor padrão é 2.147.483.648 bytes, o que pode ser muito grande e resultar no travamento do aplicativo se o aplicativo tentar alocar mais memória com o navegador falhando em concedê-la. O exemplo a seguir define o valor como 268.435.456 bytes no arquivo Program:

Ao criar um aplicativo Blazor WebAssembly destinado a navegadores de dispositivo móvel, especialmente o Safari no iOS, a diminuição da memória máxima para o aplicativo com a propriedade MSBuild EmccMaximumHeapSize pode ser necessária. O valor padrão é 2.147.483.648 bytes, o que pode ser muito grande e resultar no travamento do aplicativo se o aplicativo tentar alocar mais memória com o navegador falhando em concedê-la. O exemplo a seguir define o valor como 268.435.456 bytes no arquivo Program:

<EmccMaximumHeapSize>268435456</EmccMaximumHeapSize>

Para mais informações sobre as propriedades e destinos do Mono/WebAssembly MSBuild, confira WasmApp.Common.targets (repositório GitHub dotnet/runtime).

Formato de empacotamento Webcil para assemblies .NET

O Webcil é um formato de empacotamento amigável para assemblies .NET projetado para possibilitar o uso do Blazor WebAssembly em ambientes de rede restritivos. Os arquivos Webcil usam um wrapper WebAssembly padrão, em que os assemblies são implantados como arquivos WebAssembly que usam a extensão de arquivo .wasm padrão.

O Webcil é o formato de empacotamento padrão quando você publica um aplicativo Blazor WebAssembly. Para desabilitar o uso do Webcil, defina a seguinte propriedade MSBuild no arquivo de projeto do aplicativo:

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

Personalizar a forma como os recursos de inicialização são carregados

Personalize a forma como os recursos de inicialização são carregados usando a API do loadBootResource. Para obter mais informações, confira Inicialização Blazor do ASP.NET Core.

Compactação

Quando um aplicativo do Blazor WebAssembly é publicado, a saída é compactada estaticamente durante a publicação para reduzir o tamanho do aplicativo e remover a sobrecarga para compactação de runtime. Os seguintes algoritmos de compactação são usados:

Blazor depende do host para atender aos arquivos compactados apropriados. Ao hospedar um aplicativo autônomo Blazor WebAssembly, pode ser necessário um trabalho adicional para garantir que arquivos compactados estaticamente sejam servidos:

Blazor depende do host para atender aos arquivos compactados apropriados. Ao usar um projeto Hospedado pelo ASP.NET CoreBlazor WebAssembly, o projeto host pode executar a negociação de conteúdo e atender aos arquivos compactados estaticamente. Ao hospedar um aplicativo autônomo Blazor WebAssembly, pode ser necessário um trabalho adicional para garantir que arquivos compactados estaticamente sejam servidos:

  • Para configuração de compactação web.config do IIS, confira a seção IIS: compactação de Brotli e Gzip.
  • Ao fazer a hospedagem em soluções de hospedagem estáticas que não dão suporte à negociação de conteúdo de arquivo compactado estaticamente, considere a configuração do aplicativo para buscar e decodificar arquivos compactados em Brotli:

Obtenha o decodificador JavaScript Brotli no google/brotli repositório GitHub. O arquivo de decodificador minimizado é chamado de decode.min.js e encontrado na pasta js do repositório.

Observação

Se a versão minimizada do script decode.js (decode.min.js) falhar, tente usar a versão não minimizada (decode.js).

Atualize o aplicativo para usar o decodificador.

No arquivo wwwroot/index.html, defina autostart como false na tag Blazor de <script>:

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

Após a marca <script> do Blazor e antes da marca </body> de fechamento, adicione o bloco <script> de código JavaScript a seguir. A função a seguir chama fetch com cache: 'no-cache' para manter o cache do navegador atualizado.

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 autônomo:

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

Para obter mais informações sobre como carregar recursos de inicialização, confira Inicialização Blazor do AsP.NET Core.

Para desabilitar a compactação, adicione a propriedade do MSBuild CompressionEnabled ao arquivo de projeto do aplicativo e defina o valor como false:

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

A propriedade CompressionEnabled pode ser passada para o comando dotnet publish com a seguinte sintaxe em um shell de comando:

dotnet publish -p:CompressionEnabled=false

Para desabilitar a compactação, adicione a propriedade do MSBuild BlazorEnableCompression ao arquivo de projeto do aplicativo e defina o valor como false:

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

A propriedade BlazorEnableCompression pode ser passada para o comando dotnet publish com a seguinte sintaxe em um shell de comando:

dotnet publish -p:BlazorEnableCompression=false

Reescrever as URLs para obter o roteamento correto

O roteamento de solicitações para componentes de página em um aplicativo Blazor WebAssembly não é tão simples quanto o roteamento de solicitações em um aplicativo Blazor Server. Considere um app Blazor WebAssembly com dois componentes:

  • Main.razor: é carregado na raiz do aplicativo e contém um link para o componente About (href="About").
  • About.razor: componente About.

Quando o documento padrão do aplicativo é solicitado usando a barra de endereços do navegador (por exemplo, https://www.contoso.com/):

  1. O navegador faz uma solicitação.
  2. A página padrão é retornada, que geralmente é index.html.
  3. index.html inicia o aplicativo.
  4. O componente Router é carregado e o componente RazorMain é renderizado.

Na página principal, a seleção do link para o componente About funciona no cliente porque o roteador do Blazor impede que o navegador faça uma solicitação na Internet para o www.contoso.com no About e atende ao próprio componente About renderizado. Todas as solicitações de endpoints internos dentro do aplicativo Blazor WebAssembly funcionam da mesma maneira: as solicitações não geram requisições do navegador para recursos hospedados em servidores na Internet. O roteador trata das solicitações internamente.

Se uma solicitação for feita usando a barra de endereços do navegador para www.contoso.com/About, a solicitação falhará. Este recurso não existe no host do aplicativo na Internet; portanto, uma resposta 404 – Não Encontrado é retornada.

Como os navegadores fazem solicitações aos hosts baseados na Internet de páginas do lado do cliente, os servidores Web e os serviços de hospedagem precisam reescrever todas as solicitações de recursos que não estão fisicamente no servidor para a página index.html. Quando index.html for retornado, o roteador Blazor do aplicativo assumirá o controle e responderá com o recurso correto.

Ao implantar em um servidor IIS, você pode usar o Módulo de Reescrita de URL com o arquivo web.config publicado do aplicativo. Para obter mais informações, consulte Hospedar e implantar ASP.NET Core Blazor WebAssembly com o IIS.

Implantação hospedada com o ASP.NET Core

Uma implantação hospedada disponibiliza o aplicativo para os navegadores a partir de um Blazor WebAssembly que é executado em um servidor web.

O aplicativo Blazor WebAssembly cliente é publicado na pasta /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot do aplicativo de servidor, juntamente com qualquer outro ativo Web estático do aplicativo de servidor. Os dois aplicativos são implantados juntos. É necessário um servidor Web capaz de hospedar um aplicativo do ASP.NET Core. Para uma implantação hospedada, o Visual Studio inclui o modelo de projeto do Blazor WebAssemblyAplicativo (modelo do blazorwasm ao usar o comando dotnet new) com a opção Hosted selecionada (-ho|--hosted ao usar o comando dotnet new).

Para obter mais informações, consulte os seguintes artigos:

Implantação hospedada de um arquivo executável dependente de estrutura para uma plataforma específica

Para implantar um aplicativo do Blazor WebAssembly hospedado como um executável dependente de estrutura para uma plataforma específica (não independente), use as diretrizes a seguir com base nas ferramentas em uso.

Visual Studio

Uma implantação autônoma é configurada para um perfil de publicação gerado (.pubxml). Confirme se o perfil de publicação do projeto do Server contém a propriedade do MSBuild <SelfContained> definida como false.

No arquivo de perfil de publicação do .pubxml na Server pasta Properties do projeto:

<SelfContained>false</SelfContained>

Defina o RID (Identificador de Runtime) usando a configuração Runtime de Alvo na área de Configurações da interface de Publicação, que gera a propriedade do MSBuild <RuntimeIdentifier> no perfil de publicação:

<RuntimeIdentifier>{RID}</RuntimeIdentifier>

Na configuração anterior, o espaço reservado {RID} é o RID (Identificador de Runtime).

Publique o projeto Server na configuração Lançamento.

Observação

É possível publicar um aplicativo com as configurações de perfil de publicação usando a CLI do .NET passando /p:PublishProfile={PROFILE} para o comando dotnet publish, em que o espaço reservado {PROFILE} é o perfil. Para obter mais informações, consulte as seções Perfis de Publicação e Exemplo de Publicação de Pasta no artigo Perfis de Publicação do Visual Studio (.pubxml) para implantação de aplicativos ASP.NET Core. Se você passar o RID no comando dotnet publish e não no perfil de publicação, use a propriedade do MSBuild (/p:RuntimeIdentifier) com o comando, não com a opção -r|--runtime

CLI do .NET

Configure uma implantação independente colocando a propriedade do MSBuild <SelfContained> em um <PropertyGroup> no arquivo de projeto do projeto Server definido como false:

<SelfContained>false</SelfContained>

Importante

A propriedade SelfContained deve ser colocada no arquivo de projeto do projeto Server. A propriedade não pode ser definida corretamente com o comando dotnet publish usando a opção --no-self-contained ou a propriedade MSBuild /p:SelfContained=false.

Defina o RID (Identificador de Runtime) usando uma das seguintes abordagens:

  • Opção 1: defina o RID em um <PropertyGroup> no Server arquivo de projeto do projeto:

    <RuntimeIdentifier>{RID}</RuntimeIdentifier>
    

    Na configuração anterior, o espaço reservado {RID} é o RID (Identificador de Runtime).

    Publique o aplicativo na configuração de liberação do projeto Server:

    dotnet publish -c Release
    
  • Opção 2: passe o RID no comando dotnet publish como a propriedade do MSBuild (/p:RuntimeIdentifier), não com a opção -r|--runtime:

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

    Na configuração anterior, o espaço reservado {RID} é o RID (Identificador de Runtime).

Para obter mais informações, consulte os seguintes artigos:

Implantação autônoma

Uma implantação autônoma atende ao aplicativo do Blazor WebAssembly como um conjunto de arquivos estáticos que são solicitados diretamente pelos clientes. Qualquer servidor de arquivos estático é capaz de atender ao aplicativo do Blazor.

Os ativos de implantação autônomos são publicados na pasta /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot ou bin/Release/{TARGET FRAMEWORK}/browser-wasm/publish, onde o espaço reservado {TARGET FRAMEWORK} é a estrutura de destino.

Serviço de Aplicativo do Azure

Blazor WebAssembly os aplicativos podem ser implantados nos Serviços de Aplicativo do Azure no Windows, que hospedam o aplicativo no IIS.

Atualmente, não há suporte para a implantação de um aplicativo autônomo Blazor WebAssembly no Serviço de Aplicativo do Azure para Linux. Recomendamos hospedar um aplicativo autônomo Blazor WebAssembly usando os Aplicativos Web Estáticos do Azure, que dão suporte a esse cenário.

Aplicativo autônomo com o Docker

Um aplicativo autônomo Blazor WebAssembly é publicado como um conjunto de arquivos estáticos para hospedagem por um servidor de arquivos estático.

Para hospedar o aplicativo no Docker:

  • Escolha um contêiner do Docker com suporte de servidor Web, como Nginx ou Apache.
  • Copie os ativos da pasta publish para uma pasta de local definida no servidor Web para atender aos arquivos estáticos.
  • Aplique a configuração adicional conforme necessário para atender ao aplicativo Blazor WebAssembly.

Para obter diretrizes de configuração, confira os seguintes recursos:

Valores de configuração do host

Os aplicativos Blazor WebAssembly podem aceitar os seguintes valores de configuração do host como argumentos de linha de comando em tempo de execução no ambiente de desenvolvimento.

Raiz do conteúdo

O argumento --contentroot define o caminho absoluto para o diretório que contém os arquivos de conteúdo do aplicativo (raiz de conteúdo). Nos exemplos a seguir, /content-root-path é o caminho raiz do conteúdo do aplicativo.

  • Passe o argumento ao executar o aplicativo localmente em um prompt de comando. No diretório do aplicativo, execute:

    dotnet watch --contentroot=/content-root-path
    
  • Adicione uma entrada ao arquivo launchSettings.json do aplicativo no perfil do IIS Express. Esta configuração é usada quando o aplicativo é executado com o Depurador do Visual Studio e em um prompt de comando com dotnet watch (ou dotnet run).

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • No Visual Studio, especifique o argumento em Propriedades>Depurar>Argumentos de aplicativo. A configuração do argumento na página de propriedades do Visual Studio adiciona o argumento ao arquivo launchSettings.json.

    --contentroot=/content-root-path
    

Caminho base

O argumento --pathbase define o caminho base do aplicativo para um aplicativo executado localmente com um caminho de URL relativa não raiz (a marca <base> do href é definida como um caminho diferente de / para preparo e produção). Nos exemplos a seguir, /relative-URL-path é o caminho base do aplicativo. Para obter mais informações, consulte Caminho base do aplicativo ASP.NET CoreBlazor.

Importante

Ao contrário do caminho fornecido ao href da tag <base>, não inclua uma barra no final (/) ao passar o valor do argumento --pathbase. Se o caminho base do aplicativo for fornecido na tag <base> como <base href="/CoolApp/"> (inclui uma barra à direita), passe o valor do argumento da linha de comandos como --pathbase=/CoolApp (sem barra à direita).

  • Passe o argumento ao executar o aplicativo localmente em um prompt de comando. No diretório do aplicativo, execute:

    dotnet watch --pathbase=/relative-URL-path
    
  • Adicione uma entrada ao arquivo launchSettings.json do aplicativo no perfil do IIS Express. Esta configuração é usada ao executar o aplicativo com o Depurador do Visual Studio e em um prompt de comando com dotnet watch (ou dotnet run).

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • No Visual Studio, especifique o argumento em Propriedades>Depurar>Argumentos de aplicativo. A configuração do argumento na página de propriedades do Visual Studio adiciona o argumento ao arquivo launchSettings.json.

    --pathbase=/relative-URL-path
    

Para obter mais informações, consulte Caminho base do aplicativo ASP.NET CoreBlazor.

URLs

O argumento --urls define os endereços IP ou os endereços de host com portas e protocolos para atender solicitações.

  • Passe o argumento ao executar o aplicativo localmente em um prompt de comando. No diretório do aplicativo, execute:

    dotnet watch --urls=http://127.0.0.1:0
    
  • Adicione uma entrada ao arquivo launchSettings.json do aplicativo no perfil do IIS Express. Esta configuração é usada ao executar o aplicativo com o Depurador do Visual Studio e em um prompt de comando com dotnet watch (ou dotnet run).

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • No Visual Studio, especifique o argumento em Propriedades>Depurar>Argumentos de aplicativo. A configuração do argumento na página de propriedades do Visual Studio adiciona o argumento ao arquivo launchSettings.json.

    --urls=http://127.0.0.1:0
    

Configurar o cortador

O Blazor executa o filtro de IL (Linguagem Intermediária) em cada build de Versão para remover a IL desnecessária dos assemblies de saída. Para obter mais informações, consulte Configurar o Trimmer para ASP.NET Core Blazor.

Configurar o vinculador

O Blazor executa a vinculação de IL (linguagem intermediária) em cada build de Versão para remover a IL desnecessária dos assemblies de saída. Para obter mais informações, confira Configurar o vinculador para o ASP.NET CoreBlazor.

Alterar a extensão de nome de arquivo dos arquivos DLL

Esta seção se aplica ao .NET 5 a .NET 7. No .NET 8 ou posterior, os .NET assemblies são implantados como arquivos WebAssembly (.wasm) usando o formato de arquivo Webcil.

Se um dispositivo de firewall, programa antivírus ou segurança de rede estiver bloqueando a transmissão dos arquivos DLL (biblioteca de vínculo dinâmico) do aplicativo (.dll), você poderá seguir as diretrizes nesta seção para alterar as extensões de nome de arquivo dos arquivos DLL publicados do aplicativo.

Alterar as extensões de nome de arquivo dos arquivos DLL do aplicativo pode não resolver o problema, pois muitos sistemas de segurança examinam o conteúdo dos arquivos do aplicativo, não apenas verificam as extensões de arquivo.

Para obter uma abordagem mais robusta em ambientes que bloqueiam o download e a execução de arquivos DLL, siga uma das seguintes abordagens:

  • Use o .NET 8 ou posterior, que empacota assemblies do .NET como arquivos do WebAssembly (.wasm) usando o formato de arquivo Webcil. Para obter mais informações, consulte a seção empacotamento webcil para assemblies .NET em um artigo sobre o .NET 8 ou posterior.
  • No .NET 6 ou posterior, use um layout de implantação personalizado.

Existem abordagens de terceiros para lidar com esse problema. Para obter mais informações, confira os recursos em Awesome Blazor.

Depois de publicar o aplicativo, use um script de shell ou um pipeline de build do DevOps para renomear os arquivos .dll para usar uma extensão de arquivo diferente no diretório da saída publicada do aplicativo.

Nos seguintes exemplos:

  • O PS (PowerShell) é usado para atualizar as extensões de arquivo.
  • Os arquivos .dll são renomeados para usar a extensão de arquivo .bin na linha de comando.
  • Os arquivos listados no manifesto de inicialização publicado Blazor com uma .dll extensão de arquivo são atualizados para a extensão de arquivo .bin.
  • Se os ativos de trabalho de serviço também estiverem em uso, um comando do PowerShell atualizará os arquivos .dll listados no arquivo service-worker-assets.js para a extensão de arquivo .bin.

Para usar uma extensão de arquivo diferente de .bin, substitua .bin nos comandos a seguir pela extensão de arquivo desejada.

Nos comandos a seguir, o {PATH} espaço reservado é o caminho para a pasta publicada _framework na publish pasta.

Renomear extensões de arquivo na pasta:

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

Renomear extensões de arquivo no blazor.boot.json arquivo:

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

Se os recursos do service worker também estiverem em uso porque o aplicativo é um PWA (Progressive Web App - Aplicativo Web Progressivo):

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

No comando anterior, o marcador de posição {PATH} representa o caminho para o arquivo service-worker-assets.js publicado.

Para abordar o arquivo compactado blazor.boot.json , adote uma das seguintes abordagens:

  • Recompacte o arquivo atualizado blazor.boot.json , produzindo novos blazor.boot.json.gz e blazor.boot.json.br arquivos. (Recomendado)
  • Remova os arquivos compactados blazor.boot.json.gz e blazor.boot.json.br. (A compactação está desabilitada com essa abordagem.)

Para o arquivo compactado de um Aplicativo Web Progressivo (PWA), adote uma das seguintes abordagens:

  • Recompacte o arquivo atualizado service-worker-assets.js , produzindo novos service-worker-assets.js.br e service-worker-assets.js.gz arquivos. (Recomendado)
  • Remova os arquivos compactados service-worker-assets.js.gz e service-worker-assets.js.br. (A compactação está desabilitada com essa abordagem.)

Para automatizar a alteração da extensão no Windows no .NET 6/7, a abordagem a seguir usa um script do PowerShell colocado na raiz do projeto. O seguinte script, que desabilita a compactação, serve como base para modificações adicionais caso você queira recompactar o arquivo blazor.boot.json e o arquivo service-worker-assets.js se o aplicativo for um Aplicativo Web Progressivo (PWA). O caminho para a publish pasta é passado para o script quando ele é executado.

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

Se os ativos do service worker também estiverem em uso porque o aplicativo é um Aplicativo Web Progressivo (PWA), adicione os seguintes comandos:

((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

No arquivo de projeto, o script é executado depois de publicar o aplicativo para a configuração Release:

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

Depois de publicar o aplicativo, compacte de novo manualmente blazor.boot.json e service-worker-assets.js, se usado, para recuperar a compactação.

Observação

Ao renomear e carregar lentamente os mesmos assemblies, confira as diretrizes em Assemblies de carregamento lento no Blazor WebAssembly do ASP.NET Core.

Normalmente, o servidor do aplicativo requer a configuração de ativo estático para atender aos arquivos com a extensão atualizada. Para um aplicativo hospedado pelo IIS, adicione uma entrada de mapa MIME (<mimeMap>) para a nova extensão de arquivo na seção de conteúdo estático (<staticContent>) em um arquivo web.config personalizado. O exemplo a seguir pressupõe que a extensão de arquivo foi alterada de .dll para .bin:

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

Inclua uma atualização para arquivos compactados, se a compactação estiver em uso:

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

Remova a entrada para a extensão de arquivo .dll:

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

Remova as entradas para arquivos .dll compactados, se a compactação estiver em uso:

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

Para obter mais informações sobre arquivos personalizados web.config, consulte a seção Uso de um web.config personalizado.

Corrupção antes da implantação

Normalmente na implantação:

  • Somente os arquivos que foram alterados são substituídos, o que geralmente resulta em uma implantação mais rápida.
  • Os arquivos existentes que não fazem parte da nova implantação são deixados no lugar para serem usados pela nova implantação.

Em casos raros, os arquivos remanescentes de uma implantação anterior podem corromper uma nova implantação. Excluir completamente a implantação existente (ou aplicativo publicado localmente antes da implantação) pode resolver o problema com uma implantação corrompida. Geralmente, excluir a implantação existente uma vez é suficiente para resolver o problema, inclusive para um pipeline de build e implantação do DevOps.

Se você determinar que a limpeza de uma implantação anterior é sempre necessária quando um pipeline de build e implantação do DevOps está em uso, você pode adicionar temporariamente uma etapa ao pipeline de build para excluir a implantação anterior para cada nova implantação, até que você solucione a causa exata do dano.