Partilhar via


ASP.NET Core Blazor ambientes

Observação

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.

Importante

Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Para a versão atual, consulte a versão .NET 9 deste artigo.

Este artigo explica como configurar e ler o ambiente em um aplicativo Blazor.

Ao executar um aplicativo localmente, o padrão do ambiente é Development. Quando o aplicativo é publicado, o padrão do ambiente é Production.

Recomendamos as seguintes convenções:

  • Use sempre o nome do ambiente "Development" para o desenvolvimento local. Isso ocorre porque a estrutura ASP.NET Core espera exatamente esse nome ao configurar o aplicativo e as ferramentas para execução de desenvolvimento local de um aplicativo.

  • Para ambientes de teste, preparação e produção, sempre publique e implante o aplicativo. Você pode usar qualquer esquema de nomenclatura de ambiente que desejar para aplicativos publicados, mas sempre use nomes de arquivo de configuração de aplicativo com invólucro do segmento de ambiente que corresponda exatamente ao nome do ambiente. Para preparação, use "Staging" (maiúscula "S") como o nome do ambiente e nomeie o arquivo de configurações do aplicativo para corresponder a (appsettings.Staging.json). Para produção, use "Production" (maiúsculo "P") como o nome do ambiente e nomeie o arquivo de configurações do aplicativo para corresponder a (appsettings.Production.json).

Definir o ambiente

O ambiente é definido usando qualquer uma das seguintes abordagens:

No cliente de um Blazor Web App, o ambiente é determinado pelo servidor através de um middleware que comunica o ambiente ao navegador através de um cabeçalho chamado Blazor-Environment. O cabeçalho define o ambiente quando o WebAssemblyHost é criado no arquivo Program no lado do cliente (WebAssemblyHostBuilder.CreateDefault).

O ambiente é definido usando qualquer uma das seguintes abordagens:

No cliente de um Blazor Web App ou no cliente de uma aplicação Blazor WebAssembly hospedada, o ambiente é determinado pelo servidor através de um middleware que comunica o ambiente ao navegador através de um cabeçalho chamado Blazor-Environment. O cabeçalho define o ambiente quando o WebAssemblyHost é criado no ficheiro Program do lado do cliente (WebAssemblyHostBuilder.CreateDefault).

Para um aplicativo Blazor WebAssembly autônomo em execução local, o servidor de desenvolvimento adiciona o cabeçalho Blazor-Environment com o nome do ambiente obtido do ambiente de hospedagem. O ambiente de hospedagem define o ambiente a partir da variável de ambiente ASPNETCORE_ENVIRONMENT estabelecida pelo arquivo Properties/launchSettings.json do projeto. O valor padrão da variável de ambiente em um projeto criado a partir do modelo de projeto Blazor WebAssembly é Development. Para obter mais informações, consulte a secção Definir o ambiente do lado do cliente através do cabeçalho na secção.

Para aplicativos executados localmente em desenvolvimento, o aplicativo assume como padrão o ambiente Development. A publicação da aplicação define o ambiente padrão como Production.

Para obter orientações gerais sobre a configuração de aplicações do ASP.NET Core, consulte Usar vários ambientes no ASP.NET Core. Para a configuração de aplicações no lado do servidor com arquivos estáticos em ambientes diferentes do ambiente Development durante o desenvolvimento e teste (por exemplo, Staging), consulte ASP.NET Core Blazor arquivos estáticos.

Definir o ambiente do lado do cliente através da configuração de arranque Blazor

O exemplo a seguir inicia Blazor no ambiente Staging se o nome do host incluir localhost. Caso contrário, o ambiente é definido para o seu valor padrão.

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  if (window.location.hostname.includes("localhost")) {
    Blazor.start({
      webAssembly: {
        environment: "Staging"
      }
    });
  } else {
    Blazor.start();
  }
</script>

No exemplo anterior, o espaço reservado {BLAZOR SCRIPT} é o caminho do script Blazor e o nome do ficheiro. Para obter a localização do script, consulte a estrutura do projeto do ASP.NET Core Blazor.

Observação

Para Blazor Web Apps que definem a propriedade webAssembly>environment na configuração Blazor.start, é aconselhável alinhar o ambiente do servidor com o ambiente definido na propriedade environment. Caso contrário, a pré-renderização no servidor funcionará em um ambiente diferente da renderização no cliente, o que resulta em efeitos arbitrários. Para obter orientações gerais sobre como configurar o ambiente para um Blazor Web App, consulte Usar vários ambientes no ASP.NET Core.

Blazor WebAssemblyindependente :

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  if (window.location.hostname.includes("localhost")) {
    Blazor.start({
      environment: "Staging"
    });
  } else {
    Blazor.start();
  }
</script>

No exemplo anterior, o espaço reservado {BLAZOR SCRIPT} é o caminho do script Blazor e o nome do ficheiro. Para obter o local do script, consulte a estrutura do projeto do ASP.NET Core Blazor.

O uso da propriedade environment substitui o ambiente definido pelo cabeçalho Blazor-Environment.

A abordagem anterior define o ambiente do cliente sem alterar o valor do cabeçalho Blazor-Environment, nem altera o log do console do projeto de servidor do ambiente de inicialização para um Blazor Web App que adotou a renderização global do Interactive WebAssembly.

Para registrar o ambiente no console em um projeto Blazor WebAssembly autônomo ou no projeto .Client de um Blazor Web App, coloque o seguinte código C# no arquivo Program depois que o WebAssemblyHost for criado com WebAssemblyHostBuilder.CreateDefault e antes da linha que cria e executa o projeto (await builder.Build().RunAsync();):

Console.WriteLine(
    $"Client Hosting Environment: {builder.HostEnvironment.Environment}");

Para obter mais informações sobre a inicialização de Blazor, consulte ASP.NET Core Blazor inicialização.

Definir o ambiente do lado do cliente via cabeçalho

Blazor WebAssembly aplicativos podem definir o ambiente com o cabeçalho Blazor-Environment. Especificamente, o cabeçalho de resposta deve ser definido no arquivo _framework/blazor.boot.json, mas não há nenhum dano ao definir o cabeçalho nas respostas do servidor de arquivos para outras solicitações de arquivo Blazor ou toda a implantação Blazor.

Embora a estrutura Blazor emita o nome do cabeçalho no caso de kebab com maiúsculas e minúsculas mistas (Blazor-Environment), você pode usar todas as letras maiúsculas ou minúsculas de kebab (blazor-environment, BLAZOR-ENVIRONMENT).

Para execução de desenvolvimento local com o servidor de desenvolvimento interno do Blazor, você pode controlar o valor do cabeçalho Blazor-Environment definindo o valor da variável de ambiente ASPNETCORE_ENVIRONMENT no arquivo Properties/launchSettings.json do projeto. Ao executar localmente com o servidor de desenvolvimento, a ordem de precedência para determinar o ambiente do aplicativo é Blazor.start configuração (chaveenvironment)>Blazor-Environment cabeçalho de resposta (arquivoblazor.boot.json) >ASPNETCORE_ENVIRONMENT variável de ambiente (launchSettings.json). Não é possível usar a abordagem de variável de ambiente ASPNETCORE_ENVIRONMENT (launchSettings.json) para um aplicativo Blazor WebAssembly implantado. A técnica só funciona com o servidor de desenvolvimento em execuções locais do aplicativo.

IIS

No exemplo a seguir para o IIS, o cabeçalho personalizado (Blazor-Environment) é adicionado ao arquivo de web.config publicado. O arquivo web.config está localizado na pasta bin/Release/{TARGET FRAMEWORK}/publish, onde o espaço reservado para {TARGET FRAMEWORK} é a estrutura de destino:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    ...
    <httpProtocol>
      <customHeaders>
        <add name="Blazor-Environment" value="Staging" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

Observação

Para usar um arquivo de web.config personalizado para o IIS que não é substituído quando o aplicativo é publicado na pasta publish, consulte Host e implantar ASP.NET Core Blazor WebAssembly.

Nginx

Para servidores Nginx, use a diretiva add_header a partir do ngx_http_headers_module:

http {
    server {
        ...
        location / {
            ...
            add_header Blazor-Environment "Staging";
        }
    }
}

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

Apache

Para servidores Apache, use a diretiva Header do módulo mod_headers:

<VirtualHost *:80>
    ...
    Header set Blazor-Environment "Staging"
    ...
</VirtualHost>

Para mais informações:

Definir o ambiente para o Serviço de Aplicativo do Azure

Para uma aplicação de Blazor WebAssembly autónomo, pode-se definir o ambiente manualmente através da configuração de início ou do cabeçalho Blazor-Environment.

Para um aplicativo do lado do servidor, defina o ambiente por meio de uma configuração de aplicativo ASPNETCORE_ENVIRONMENT no Azure:

  1. Confirme se o invólucro dos segmentos de ambiente nos nomes de arquivo de configurações do aplicativo corresponde exatamente ao invólucro do nome do ambiente. Por exemplo, o nome do arquivo de configurações do aplicativo correspondente para o ambiente Staging é appsettings.Staging.json. Se o nome do arquivo for appsettings.staging.json (minúscula "s"), o arquivo não será localizado e as configurações no arquivo não serão usadas no ambiente Staging.

  2. Para implantação do Visual Studio, confirme se o aplicativo está implantado no slot de implantação correto. Para um aplicativo chamado BlazorAzureAppSample, o aplicativo é implantado no slot de implantação Staging.

  3. No portal do Azure para o slot de implantação do ambiente, configure o ambiente com a configuração de aplicativo "ASPNETCORE_ENVIRONMENT". Para uma aplicação chamada BlazorAzureAppSample, o Slot do Serviço de Aplicações intermédio é denominado BlazorAzureAppSample/Staging. Para a configuração do slot Staging, crie uma configuração de aplicativo para ASPNETCORE_ENVIRONMENT com um valor de Staging. A configuração do slot de implantação está habilitada para a configuração.

Quando solicitado em um navegador, o aplicativo BlazorAzureAppSample/Staging é carregado no ambiente Staging em https://blazorazureappsample-staging.azurewebsites.net.

Quando o aplicativo é carregado no navegador, a coleção de cabeçalhos de resposta para blazor.boot.json indica que o valor do cabeçalho Blazor-Environment é Staging.

As definições da aplicação são carregadas pela aplicação a partir do ficheiro appsettings.{ENVIRONMENT}.json, onde o marcador de posição {ENVIRONMENT} é o ambiente da aplicação. No exemplo anterior, as configurações do arquivo appsettings.Staging.json são carregadas.

Ler o ambiente numa aplicação Blazor WebAssembly

Obtenha o ambiente da aplicação em um componente injetando IWebAssemblyHostEnvironment e lendo a propriedade Environment.

ReadEnvironment.razor:

@page "/read-environment"
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env

<h1>Environment example</h1>

<p>Environment: @Env.Environment</p>

Leia o ambiente do lado do cliente num Blazor Web App

Supondo que a pré-renderização não esteja desabilitada para um componente ou o aplicativo, um componente no projeto .Client é pré-renderizado no servidor. Como o servidor não tem um serviço IWebAssemblyHostEnvironment registado, não é possível injetar o serviço nem usar os métodos e propriedades de extensão do ambiente de acolhimento da implementação do serviço durante a pré-renderização do servidor. Injetar o serviço em um componente Interactive WebAssembly ou Interactive Auto resulta no seguinte erro de tempo de execução:

There is no registered service of type 'Microsoft.AspNetCore.Components.WebAssembly.Hosting.IWebAssemblyHostEnvironment'.

Para resolver isso, crie uma implementação de serviço personalizada para IWebAssemblyHostEnvironment no servidor. Adicione a seguinte classe ao projeto de servidor.

ServerHostEnvironment.cs:

using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.AspNetCore.Components;

public class ServerHostEnvironment(IWebHostEnvironment env, NavigationManager nav) : 
    IWebAssemblyHostEnvironment
{
    public string Environment => env.EnvironmentName;
    public string BaseAddress => nav.BaseUri;
}

No arquivo Program do projeto de servidor, registre o serviço:

builder.Services.TryAddScoped<IWebAssemblyHostEnvironment, ServerHostEnvironment>();

Neste ponto, o serviço IWebAssemblyHostEnvironment pode ser injetado em um WebAssembly interativo ou componente Auto interativo e usado como mostrado na seção Leia o ambiente em um aplicativo Blazor WebAssembly.

O exemplo anterior pode demonstrar que é possível ter um ambiente de servidor diferente do ambiente cliente, o que não é recomendado e pode levar a resultados arbitrários. Ao definir o ambiente num Blazor Web App, é melhor combinar os ambientes de servidor e de projeto .Client. Considere o seguinte cenário em um aplicativo de teste:

  • Implemente a propriedade de ambiente do lado do cliente (webassembly) com o ambiente Staging via Blazor.start. Consulte a secção Definir o ambiente do lado do cliente através de configuração de inicialização para um exemplo.
  • Não altere o arquivo Properties/launchSettings.json do lado do servidor. Deixe a seção environmentVariables com a variável de ambiente ASPNETCORE_ENVIRONMENT definida como Development.

Você pode ver a alteração no valor da propriedade IWebAssemblyHostEnvironment.Environment na interface.

Quando a pré-renderização ocorre no servidor, o componente é renderizado no ambiente Development:

Environment: Development

Quando o componente é reprocessado apenas um ou dois segundos depois, depois que o pacote de Blazor é baixado e o tempo de execução do .NET WebAssembly é ativado, os valores mudam para refletir que o cliente está operando no ambiente Staging no cliente:

Environment: Staging

O exemplo anterior demonstra por que recomendamos definir o ambiente do servidor para corresponder ao ambiente do cliente para implantações de desenvolvimento, teste e produção.

Para obter mais informações, consulte a secção de serviços do lado do cliente que falham em resolver durante a pré-renderização na secção do artigo Modos de renderização, que aparece posteriormente na documentação Blazor.

Leia o ambiente do lado do cliente durante a inicialização

Durante a inicialização, o WebAssemblyHostBuilder expõe o IWebAssemblyHostEnvironment por meio da propriedade HostEnvironment, que permite a lógica específica do ambiente no código do construtor de hosts.

No ficheiro Program:

if (builder.HostEnvironment.Environment == "Custom")
{
    ...
};

Os seguintes métodos de extensão de conveniência disponibilizados através de WebAssemblyHostEnvironmentExtensions permitem verificar o ambiente atual para Development, Production, Staginge nomes de ambiente personalizados:

No ficheiro Program:

if (builder.HostEnvironment.IsStaging())
{
    ...
};

if (builder.HostEnvironment.IsEnvironment("Custom"))
{
    ...
};

A propriedade IWebAssemblyHostEnvironment.BaseAddress pode ser usada durante a inicialização quando o serviço NavigationManager não estiver disponível.

Recursos adicionais