Start Debugging

Blazor Server vs Blazor WebAssembly vs Blazor United in .NET 11: Was sollten Sie 2026 wählen?

Für jede neue Blazor-App auf .NET 11 erstellen Sie eine Blazor Web App (das Template, das früher Blazor United hieß) und wählen den Render-Modus pro Seite. Nur Server- oder nur WebAssembly-Templates sind nur in engen Fällen sinnvoll.

Für ein neues Blazor-Projekt auf .NET 11 lautet die Antwort: das Blazor-Web-App-Template (das Modell, das im Preview von .NET 8 unter dem Spitznamen “Blazor United” lief). Es lässt Sie das Rendering pro Komponente entscheiden: statisches serverseitiges Rendering für Marketing-Seiten, interaktiven Server für latenzarme CRUD-Bildschirme, interaktives WebAssembly für offline-fähige Widgets und Auto für Komponenten, die von Server zu WebAssembly wechseln sollen, sobald das WASM-Payload fertig heruntergeladen ist. Wählen Sie ein reines Server- oder reines WebAssembly-Template nur dann, wenn Sie eine harte Einschränkung haben, die das vereinheitlichte Modell ausschließt: eine interne App, in der der WebAssembly-Download ein K.-o.-Kriterium ist, oder eine PWA, die vollständig offline gegen eine Drittanbieter-API laufen muss.

Dieser Beitrag zielt auf .NET 11 (zum Zeitpunkt des Schreibens als Preview, GA geplant für November 2026) und das Paket-Set Microsoft.AspNetCore.Components 11.0.x. Die Projekt-Templates stammen aus Microsoft.AspNetCore.Components.WebAssembly.Templates und dem mit dem .NET-11-SDK ausgelieferten Template dotnet new blazor. Wo das Verhalten versionsübergreifend wichtig ist, weise ich inline auf die Unterschiede zwischen .NET 8, .NET 9, .NET 10 und .NET 11 hin.

Was “Blazor United” in .NET 11 tatsächlich ist

“Blazor United” ist kein eigenes Hosting-Modell. Es war der Arbeitsname, den Microsoft im Preview-Zyklus von .NET 8 für das verwendet hat, was als Blazor Web App-Template veröffentlicht wurde. Das Template kombiniert vier Render-Modi in einem Projekt:

Sie deklarieren den Modus pro Komponente mit @rendermode InteractiveServer, @rendermode InteractiveWebAssembly oder @rendermode InteractiveAuto. Dieselbe .razor-Datei kann in jedem dieser Modi laufen, solange sie keine modusspezifischen APIs aufruft (mehr dazu unten).

Blazor Server (das eigenständige Template, dotnet new blazorserver) und Blazor WebAssembly (dotnet new blazorwasm) existieren in .NET 11 weiter, aber Microsofts Empfehlung seit .NET 8 lautet: Bevorzugen Sie das vereinheitlichte Blazor-Web-App-Template, sofern Sie keinen konkreten Grund dagegen haben.

Die Feature-Matrix

FunktionBlazor Server (eigenständig)Blazor WebAssembly (eigenständig)Blazor Web App / United (.NET 11)
Rendering-OrtServerBrowserpro Komponente (Static, Server, WASM, Auto)
Initiales Payload (kalter Cache)~50-80 KB HTML~1,4 MB WASM + Assemblies (R2R, .NET 11)~50-80 KB HTML, WASM lädt nach Bedarf
First Contentful Paint (LAN)~80-150 ms~600-900 ms~80-150 ms (Static / Server) ~600-900 ms (WASM-first)
Zeit bis interaktiv nach FCPzehn ms (WebSocket öffnen)hunderte ms (WASM-Boot)hängt vom Render-Modus der Seite ab
Persistenter WebSocket erforderlichja (SignalR)neinnur für Interactive-Server-Komponenten
Funktioniert offlineneinja (mit Service Worker)ja für WebAssembly-Komponenten, nein für Server
Direkter Zugriff auf Datenbank / Dateien / Secretsja (Serverprozess)nein (Browser-Sandbox)ja in Server-Komponenten, nein in WASM-Komponenten
.NET-API-Oberflächevolle Server-Laufzeitreduzierter, browserfähiger Teilbereichbeide, je nach Komponente
Debugging-ErfahrungF5 in Visual Studio / RiderChrome-DevTools + VS-WebAssembly-Debuggerbeide
Skalierungsgrenze pro Serverbegrenzt durch offene Circuits (~5k pro Knoten)unbegrenzt (statische Dateien + API)nur für Interactive-Server-Seiten begrenzt
Native-AOT-Unterstützungnein (Server bleibt JIT)teilweise via WASM AOTpro Render-Modus
AuthentifizierungsmodellCookie + CircuitOIDC / Token im BrowserCookie für SSR/Server, Token für WASM
Status in .NET 11unterstützt, nicht der empfohlene Standardunterstützt, nicht der empfohlene Standardempfohlener Standard

Die Zeile, die das Gespräch für die meisten neuen Apps beendet, ist die letzte. Microsofts eigene Templates, Dokumentationsbeispiele und Tutorials beginnen mit dem Blazor-Web-App-Template. Nur Server oder nur WebAssembly 2026 zu wählen ist heute eine explizite Abweichung, die begründet werden muss.

Wann Blazor Server (eigenständig) wählen

Das eigenständige Blazor-Server-Template ist weiterhin die richtige Wahl, wenn Sie eine dieser Einschränkungen haben:

Eine minimale Blazor-Server-Program.cs in .NET 11:

// .NET 11, C# 14, Microsoft.AspNetCore.Components.Server 11.0.x
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();

app.UseStaticFiles();
app.UseAntiforgery();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.Run();

Beachten Sie: AddRazorComponents() plus AddInteractiveServerComponents() ist die API ab .NET 8. Das alte AddServerSideBlazor() funktioniert noch, läuft aber über eine Kompatibilitätsschicht und aktiviert nicht die neue Render-Modus-Infrastruktur. Verwenden Sie die neuen APIs in jedem Greenfield-Projekt.

Wann Blazor WebAssembly (eigenständig) wählen

Greifen Sie zum eigenständigen WebAssembly-Template, wenn:

Eine minimale Blazor-WebAssembly-Program.cs in .NET 11:

// .NET 11, C# 14, Microsoft.AspNetCore.Components.WebAssembly 11.0.x
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddScoped(sp => new HttpClient
{
    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
});

await builder.Build().RunAsync();

In .NET 11 hat die WebAssembly-Laufzeit für neue Projekte Multithreading standardmäßig aktiviert, sobald Sie <WasmEnableThreads>true</WasmEnableThreads> in der .csproj setzen. Damit entfällt einer der größten Gründe, Blazor WebAssembly abzulehnen: CPU-gebundene Arbeit blockiert den UI-Thread nicht mehr.

Wann Blazor Web App (das United-Modell) wählen

Für alles andere. Das vereinheitlichte Template liefert ein einziges Projekt, in dem:

Diese Komponierbarkeit erreicht nichts anderes. Sie haben nicht mehr eine binäre “Server-App oder WASM-App”-Entscheidung, sondern eine Entscheidung pro Seite, ganz wie Next.js Ihnen erlaubt, ssr, static und client zu mischen. Eine minimale Blazor-Web-App-Program.cs in .NET 11:

// .NET 11, C# 14, Microsoft.AspNetCore.Components.Server 11.0.x +
// Microsoft.AspNetCore.Components.WebAssembly.Server 11.0.x
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents()
    .AddInteractiveWebAssemblyComponents();

var app = builder.Build();

app.UseStaticFiles();
app.UseAntiforgery();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode()
    .AddInteractiveWebAssemblyRenderMode()
    .AddAdditionalAssemblies(typeof(BlazorApp.Client._Imports).Assembly);

app.Run();

Das mit dem Template gelieferte .Client-Projekt ist der Ort für Komponenten, die in WebAssembly laufen müssen. Reine Server-Komponenten bleiben im Host-Projekt. Interactive-Auto-Komponenten leben in .Client (weil sie auch von der WebAssembly-Seite erreichbar sein müssen).

Die Daten zu Kaltstart und Bundle-Größe

Die Zahlen unten stammen aus jeweils frischen dotnet new blazor, dotnet new blazorserver und dotnet new blazorwasm auf .NET-11-SDK 11.0.100-preview.4.26152.6, mit dotnet publish -c Release veröffentlicht und von dotnet run bereitgestellt. Gemessen mit Chrome 137 auf einem MacBook Pro M2, kaltem Cache, mit Drosselung “Fast 3G” in den DevTools.

MetrikBlazor ServerBlazor WebAssemblyBlazor Web App (Auto-Landing)
Initial übertragenes HTML8 KB4 KB8 KB
Übertragene WebAssembly + Assemblies01,42 MB (gzip)1,42 MB (gzip, nach Bedarf)
Zeit bis First Contentful Paint320 ms1850 ms340 ms
Zeit bis interaktiv (Counter-Button)410 ms2300 ms440 ms (Server) / 2400 ms (Übergabe an WASM)
Speicher nach erster Navigation7 MB Browser38 MB Browser9 MB, dann 41 MB nach der Übergabe

Die Blazor Web App im Auto-Modus schlägt eigenständiges WebAssembly beim First Paint um Faktor fünf, weil sie nicht auf das Bundle wartet. Sie schlägt nicht den eigenständigen Server, weil sobald das WebAssembly-Bundle fertig geladen ist, ohnehin Speicher anfällt. Der Punkt ist nicht, dass Auto in einer Metrik am schnellsten ist. Der Punkt ist, dass Auto nie das langsamste ist.

Für einen tieferen Blick darauf, wie das .NET-11-SDK das WASM-Bundle trimmt, siehe das neue Blazor-WebWorker-Template aus .NET 11, das dieselben Trimmer-Einstellungen verwendet.

Der Stolperstein, der für Sie entscheidet

Drei Dinge erzwingen die Entscheidung unabhängig von Präferenz:

  1. Sie können keine DbContext-Injektion in eine WebAssembly-Komponente legen. Ebenso wenig einen IConfiguration-Wert, der ein Secret enthält. Auch keinen Blob-Client, der einen Connection-String nutzt. Der Browser ist designbedingt eine feindliche Umgebung. Wenn Ihre Komponente die Datenbank direkt lesen muss, muss sie Server sein (oder Sie brauchen eine Backend-API, die die WASM-Komponente aufruft). Das Blazor-Web-App-Template macht das früh klar: Legen Sie @inject ApplicationDbContext Db in eine .Client-Komponente, und der Build schlägt mit einem klaren Fehler zu fehlender Dependency Injection fehl.

  2. Sie können @rendermode nicht innerhalb einer Render-Modus-Grenze umschalten. Eine als Static Server gerenderte Seite kann eine Interactive-Server-Insel hosten, eine Interactive-Server-Seite kann Interactive-WebAssembly-Inseln hosten, aber Sie können Interaktivität nicht in Interaktivität verschachteln. In der Praxis heißt das: Wählen Sie den niedrigsten Render-Modus, der für die Seite reicht, und eskalieren Sie nur auf Insel-Ebene.

  3. HTTPS, Antiforgery und der Authentifizierungszustand laufen standardmäßig über Cookies. WebAssembly-Komponenten sehen diese Cookies bei Cross-Origin-Anfragen nicht. Wenn der WebAssembly-Teil einer Blazor Web App eine externe API aufruft, brauchen Sie obendrauf einen OIDC-Token-Flow, nicht nur das Host-Cookie. Das ist die häufigste Stolperfalle bei der Migration einer Blazor-Server-App auf das Web-App-Template.

Speziell zur Antiforgery-Perspektive behandeln das TempData-Verhalten in Blazor SSR unter .NET 11 und der Leitfaden zu geteilter Validierungslogik die praktischen Muster.

Empfehlung, neu formuliert

Für ein neues Blazor-Projekt auf .NET 11 im Jahr 2026 starten Sie mit dotnet new blazor (dem Blazor-Web-App-Template) und vergeben Render-Modi pro Seite. Die Kosten, für eine Marketing-Seite auf @rendermode StaticServer herunter- oder für eine offline-fähige Komponente auf @rendermode InteractiveWebAssembly hochzugehen, sind nahezu null verglichen mit den Kosten, das falsche eigenständige Template zu wählen und später umzuschreiben. Wählen Sie dotnet new blazorserver nur, wenn Sie ein hartes Verbot von WebAssembly-Downloads haben. Wählen Sie dotnet new blazorwasm nur, wenn Ihr Deployment-Ziel keine .NET-Laufzeit hat oder Sie das Front-End in MAUI Hybrid oder Electron einbetten.

Wenn Sie heute schon auf Blazor Server sind und eine Migration abwägen, ist das Ziel fast immer das Blazor-Web-App-Template, mit den meisten Ihrer bestehenden Seiten auf @rendermode InteractiveServer. Das ist die risikoärmste Migration: Das Verhalten bleibt für die migrierten Seiten identisch, und Sie schalten die Möglichkeit frei, Static-Server- und Auto-Komponenten inkrementell hinzuzufügen.

Verwandt

Quellen

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Zurück