# .NET 9 Blazor: Desenvolvimento Full-Stack com Blazor United em 2026 > .NET 9 Blazor United combina renderização estática SSR, Server e WebAssembly em um framework full-stack unificado. Tutorial prático cobrindo modos de renderização, streaming, injeção por construtor e padrões prontos para produção. - Published: 2026-04-26 - Updated: 2026-04-26 - Author: SharpSkill - Tags: dotnet, blazor, aspnet-core, webassembly, full-stack - Reading time: 8 min --- Blazor United no .NET 9 une três estratégias de renderização — renderização estática do lado do servidor (SSR), Server interativo e WebAssembly — em um único framework full-stack coeso. Esse modelo unificado, introduzido no .NET 8 e aprimorado no .NET 9, elimina a necessidade de escolher entre diferentes modelos de hospedagem do Blazor antes mesmo de escrever a primeira linha de código. > **Blazor United em resumo** > > Blazor United permite combinar SSR estático, interatividade Server e interatividade WebAssembly dentro da mesma aplicação. Cada componente declara independentemente seu modo de renderização, proporcionando controle granular sobre desempenho e interatividade por página. ## Configurando uma aplicação Blazor Web com .NET 9 O template `blazorweb` do .NET 9 gera um projeto pré-configurado para os três modos de renderização. A configuração requer o SDK do .NET 9 (versão 9.0.100 ou posterior) e cria tanto o projeto do servidor quanto o do cliente (WASM) em um único comando. ```bash # Criar uma nova Blazor Web App com todos os modos de renderização habilitados dotnet new blazorweb -n FullStackApp --interactivity Auto --all-interactive false cd FullStackApp dotnet run ``` A flag `--interactivity Auto` habilita os modos de renderização Server e WebAssembly. O parâmetro `--all-interactive false` mantém a renderização estática SSR como padrão, de modo que a interatividade é ativada componente por componente em vez de globalmente. ## Entendendo os modos de renderização do Blazor no .NET 9 Cada componente em uma Blazor Web App adota um modo de renderização que determina onde ele é executado, se suporta interatividade e como se comunica com o servidor. O .NET 9 oferece quatro modos distintos. | Modo de renderização | Hospedagem | Interatividade | Ideal para | |---|---|---|---| | SSR estático | Servidor | Nenhuma | Páginas de marketing, documentação, conteúdo SEO | | Interactive Server | Servidor via SignalR | Completa | Dashboards, CRUD, formulários | | Interactive WebAssembly | Navegador via WASM | Completa | Modo offline, lógica intensiva no cliente | | Interactive Auto | Servidor depois WASM | Completa | O melhor dos dois mundos — carregamento rápido + independência | O modo de renderização é definido no nível do componente com a diretiva `@rendermode`. Essa granularidade por componente significa que uma única página pode mesclar seções estáticas e interativas. ```csharp // Components/Pages/Dashboard.razor @page "/dashboard" @rendermode InteractiveServer Dashboard

Real-Time Metrics

``` Uma adição na API do .NET 9 — `ComponentBase.RendererInfo` — permite que os componentes detectem seu modo de renderização atual em tempo de execução, possibilitando lógica condicional baseada no contexto de execução. ```csharp // Components/Shared/AdaptiveComponent.razor @if (RendererInfo.IsInteractive) { } else { Static Fallback Link } @code { private void HandleClick() { // Runs only in interactive modes (Server or WASM) } } ``` ## Renderização em streaming para páginas com carga assíncrona Páginas SSR estáticas que buscam dados de forma assíncrona podem bloquear a resposta até que todas as tarefas sejam concluídas. A renderização em streaming resolve esse problema enviando HTML de placeholder imediatamente e, em seguida, transmitindo o conteúdo final conforme os dados chegam. No .NET 9, o atributo `[StreamRendering]` não requer mais o parâmetro `true` — ele é habilitado por padrão. ```csharp // Components/Pages/Products.razor @page "/products" @attribute [StreamRendering] Product Catalog @if (products is null) {

Loading products...

} else {
@foreach (var product in products) { }
} @code { private List? products; // Data loads asynchronously; streaming pushes updates to the browser protected override async Task OnInitializedAsync() { products = await ProductService.GetAllAsync(); } } ``` A renderização em streaming utiliza a codificação de transferência em partes (chunked transfer encoding) do HTTP/1.1, compatível com todos os navegadores modernos. O conteúdo de placeholder é exibido instantaneamente, e a marcação final o substitui sem recarregamento completo da página. ## Injeção por construtor em componentes Blazor O .NET 9 introduz a injeção por construtor para componentes Blazor, complementando a diretiva `@inject` e o atributo `[Inject]` existentes. Combinada com os construtores primários do C# 12, as dependências de serviços se tornam parte da assinatura de tipo do componente. ```csharp // Components/Pages/OrderHistory.razor @page "/orders" @rendermode InteractiveServer

Order History

@if (orders is not null) { @foreach (var order in orders) { }
Order IDDateTotal
@order.Id @order.PlacedAt.ToShortDateString() @order.Total.ToString("C")
} @code { // Constructor injection via primary constructor [Inject] public required IOrderService OrderService { get; set; } [Inject] public required NavigationManager Nav { get; set; } private List? orders; protected override async Task OnInitializedAsync() { orders = await OrderService.GetRecentOrdersAsync(); } } ``` A injeção por construtor torna as dependências explícitas e simplifica os testes unitários. Os serviços registrados em `Program.cs` são resolvidos automaticamente, incluindo os serviços com chave adicionados via `builder.Services.AddKeyedScoped()`. ## Modo Interactive Auto — o melhor dos dois mundos O modo Auto oferece o menor tempo de carregamento percebido. Na primeira visita, o componente é executado no servidor via SignalR enquanto o runtime do WebAssembly é baixado em segundo plano. Nas visitas seguintes, a execução passa inteiramente para o navegador. ```csharp // Components/Pages/Chat.razor @page "/chat" @rendermode InteractiveAuto

Live Chat

@foreach (var msg in messages) {
@msg.Author: @msg.Text
}
@code { [Inject] public required IChatService ChatService { get; set; } private List messages = new(); private string newMessage = string.Empty; protected override async Task OnInitializedAsync() { messages = await ChatService.GetRecentMessagesAsync(); } private async Task HandleKey(KeyboardEventArgs e) { if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(newMessage)) { await ChatService.SendAsync(newMessage); newMessage = string.Empty; } } } ``` O modo Auto exige que as dependências e a lógica do componente funcionem em ambos os contextos, servidor e WASM. Os serviços devem ser abstraídos por meio de interfaces e registrados nos contêineres de injeção de dependência tanto do servidor quanto do cliente. ## Reconexão e resiliência no .NET 9 O .NET 9 reescreve a lógica de reconexão do Blazor Server com uma estratégia de backoff exponencial. Em vez de tentar novamente em intervalos fixos, o framework começa com tentativas rápidas e aumenta progressivamente o intervalo — reduzindo a carga do servidor durante interrupções e recuperando-se rapidamente de falhas breves. Melhorias principais: - Navegar de volta a uma aba dispara uma tentativa de reconexão imediata - Se o servidor já liberou o circuito, a página é atualizada automaticamente - A interface padrão exibe "Reconectando ao servidor..." com um indicador de progresso - Os intervalos de nova tentativa são configuráveis via `Blazor.start()` ```javascript // wwwroot/app.js — Custom reconnection configuration Blazor.start({ circuit: { reconnectionOptions: { retryIntervalMilliseconds: (retryNumber) => { // Exponential backoff: 200ms, 400ms, 800ms, max 30s return Math.min(200 * Math.pow(2, retryNumber), 30000); }, maxRetries: 15 } } }); ``` ## SSR estático com interatividade seletiva A arquitetura recomendada para a maioria das Blazor Web Apps em 2026 começa com SSR estático como padrão, adicionando interatividade apenas onde for necessário. O atributo `[ExcludeFromInteractiveRouting]` (novo no .NET 9) marca as páginas que devem permanecer estáticas — útil para páginas que dependem de cookies HTTP ou do ciclo de requisição/resposta. ```csharp // Components/Pages/Privacy.razor @page "/privacy" @attribute [ExcludeFromInteractiveRouting] Privacy Policy

Privacy Policy

Last updated: April 2026

``` Esse padrão funciona bem com `MapStaticAssets`, um novo middleware do .NET 9 que comprime e adiciona fingerprints aos arquivos estáticos no momento do build, substituindo a abordagem anterior de `UseStaticFiles` com uma entrega otimizada pronta para uso. ## Ganhos de desempenho com a compilação AOT do .NET 9 A compilação AOT (Ahead-of-Time) do .NET 9 reduz o tamanho dos payloads do WebAssembly em até 40% em comparação com o .NET 8. A inicialização do Blazor WASM é 25% mais rápida segundo os benchmarks do Google Lighthouse. Esses ganhos são aplicados automaticamente ao publicar com AOT habilitado. ```bash # Publish with AOT for production dotnet publish -c Release -p:RunAOTCompilation=true ``` A compressão de WebSocket também está habilitada por padrão para componentes interativos Server. Uma Content Security Policy (`frame-ancestors: 'self'`) é aplicada automaticamente para mitigar vetores de ataque relacionados à compressão. ## Conclusão - Blazor United no .NET 9 elimina a decisão do modelo de hospedagem ao combinar SSR estático, Server e WebAssembly em um único projeto - Os modos de renderização são configurados por componente com `@rendermode` para otimizar cada página de forma independente — estático para SEO, Server para dashboards, Auto para cenários híbridos - A renderização em streaming com `[StreamRendering]` elimina atrasos de carregamento em páginas com alta carga assíncrona - A injeção por construtor (nova no .NET 9) torna as dependências dos componentes explícitas e testáveis - O modo Auto entrega um primeiro carregamento rápido via Server e depois muda para WASM para total independência do cliente - O backoff exponencial na reconexão reduz conexões perdidas e elimina recarregamentos manuais de página - A compilação AOT reduz o tamanho dos payloads WASM em 40% e o tempo de inicialização em 25% - Toda Blazor Web App deve começar com SSR estático como padrão e adicionar interatividade somente onde a experiência do usuário exigir --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/pt/blog/dotnet/dotnet-9-blazor-united-full-stack-development