Blazor has matured from an interesting experiment into a production-grade framework that .NET teams are choosing over React and Vue for internal enterprise applications. But "Blazor" isn't one thing — it's three distinct hosting models with very different architecture, performance profiles, and operational requirements.
Pick the wrong one and you're either fighting SignalR latency in a data-heavy dashboard or shipping a 10 MB WASM download for a simple internal tool. This guide breaks down each model honestly, with a decision matrix at the end so you can land on the right choice without six weeks of proof-of-concept work.
What Changed in Blazor in 2024–2026
Before the comparison, it's worth noting what's shifted recently. .NET 8 introduced Blazor United (also called Blazor Web App), which unified Blazor Server and Blazor WASM under a single project structure. You can now choose the rendering mode at the component level — some components run on the server, others in the browser, and others are statically pre-rendered.
This is a big deal. It means the "pick one model" decision has softened into "pick the right model per component." But it also means there's a new layer of nuance to understand before you start building.
- .NET 8 / Blazor United: Per-component render mode selection (Server, WASM, Static SSR, Auto)
- .NET 9: Improved WASM startup time, Ahead-of-Time (AoT) compilation improvements, enhanced streaming rendering
- Blazor Hybrid: Desktop and mobile apps via .NET MAUI with a WebView running Blazor UI — production-stable
Blazor Server: The Right Choice More Often Than You Think
Blazor Server runs your C# component logic entirely on the server. The browser renders HTML and sends UI events (clicks, inputs) over a persistent SignalR WebSocket connection. The server processes the event, calculates the diff, and sends DOM updates back to the browser.
Architecture at a glance
- All .NET code runs on the server — no WASM download, no code exposure
- Initial load is fast: no large payload, just HTML + a small SignalR client library
- Database access, EF Core, internal APIs — all work directly in component code
- Each active user holds a SignalR connection (server memory: ~250 KB per circuit)
Real-world fit: Blazor Server is ideal for internal enterprise tools where users are on reliable corporate networks. Think: approval portals, admin dashboards, ERP screens, HR management tools. If your app is on an intranet and you have fewer than 10,000 concurrent users, Blazor Server is almost always the right call.
The latency problem — and when it actually matters
The criticism of Blazor Server is latency. Every UI interaction goes to the server and back before the DOM updates. On a 20ms round-trip, that's imperceptible. On a 200ms round-trip (remote user, VPN, shared cloud server), typing into a search box can feel sluggish.
Mitigation patterns:
- Use
@bind:event="oninput"with debounce for search fields rather than live updates - Optimistic UI updates: update local state immediately, then confirm from server
- Azure SignalR Service for horizontal scaling without sticky sessions
- Region-close hosting: deploy to Azure regions nearest your user base
Scaling Blazor Server
The in-memory circuit model means Blazor Server doesn't scale horizontally by default — users must reconnect to the same server instance. Solutions:
- Azure SignalR Service: Offloads SignalR connections, enables horizontal scaling with no sticky sessions required
- ARR Affinity (Azure App Service): Forces session stickiness — simpler but limits true horizontal scale
- Circuit count per server: ~4,000–5,000 active circuits on a standard 4-core instance (250 KB per circuit)
Blazor WebAssembly: When the Browser Needs to Own It
Blazor WASM runs the .NET runtime inside the browser via WebAssembly. Your entire application — C# code, .NET libraries, data — runs client-side. No server-side Blazor circuit, no persistent connection requirement.
Architecture at a glance
- First-load downloads the .NET WASM runtime + your DLLs (~6–15 MB, cached after first visit)
- All interactions happen in-browser — no network latency for UI updates
- Works fully offline after initial load (PWA-ready)
- API calls still hit your server, but UI logic runs locally
- Server only needs to serve the static files + API endpoints
Real-world fit: Blazor WASM shines when you need offline capability, when users are geographically distributed on varied network conditions, or when you want a pure SPA feel with no server-managed state. Field apps, mobile PWAs, and customer-facing portals are strong candidates.
AoT compilation in .NET 9
Ahead-of-Time compilation converts .NET IL to native WebAssembly ahead of deployment rather than using an interpreted WASM runtime. Results: runtime performance improved by 50–70% in compute-heavy scenarios. Tradeoff: AoT increases the publish size. For most enterprise apps the runtime performance gain is worth it.
<!-- In your .csproj to enable AoT -->
<PropertyGroup>
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
Trimming and size management
Blazor WASM apps can balloon quickly. Key controls:
- IL Trimming: Removes unused code from the published output. Enable with
<PublishTrimmed>true</PublishTrimmed> - Lazy loading: Load assemblies on demand rather than at startup. Large feature areas (reporting, admin screens) benefit most
- Brotli compression: Blazor's publish pipeline includes Brotli-compressed files — ensure your hosting serves them with
Content-Encoding: br
Blazor Hybrid: .NET MAUI + Blazor for Desktop and Mobile
Blazor Hybrid runs Blazor components inside a native app shell via a WebView control. The Blazor UI renders locally (no server, no WASM in the browser), and it has full native device access through the .NET MAUI layer. This is for desktop and mobile — not web.
When Blazor Hybrid makes sense
- You need a desktop or mobile app but want to reuse your existing Blazor component library
- You need native device access (camera, Bluetooth, local file system, biometrics)
- You want to ship to Windows, macOS, iOS, and Android from one codebase
- Your team is .NET-native and doesn't want to context-switch to React Native or Flutter
Component reuse: A well-structured Blazor project can share 70–85% of its component library between a Blazor Web App and a MAUI Hybrid app. Put components in a shared Razor Class Library. Web-specific and native-specific code lives in separate projects that reference the shared library.
Blazor Hybrid vs Flutter
If your team is choosing between Blazor Hybrid and Flutter for a mobile app, the key differentiator is your team's existing skillset. Flutter (Dart) has better native rendering performance and a richer mobile UI ecosystem. Blazor Hybrid gives you a .NET/C# team with near-zero learning curve for component building. For complex mobile apps targeting iOS and Android as primary platforms, Flutter still has the edge. For internal enterprise apps where your team is predominantly .NET, Blazor Hybrid is a legitimate choice that ships faster.
Blazor United (Web App Model): The New Default
From .NET 8 onward, new Blazor projects use the Blazor Web App template, which supports all render modes in a single project. You declare the render mode on individual components or at the page level:
@* Render this page on the server with interactive SignalR *@
@rendermode InteractiveServer
@* Or render this component in WebAssembly *@
@rendermode InteractiveWebAssembly
@* Or use Auto mode: WASM when cached, Server on first load *@
@rendermode InteractiveAuto
Auto mode is particularly useful for first-load performance: the first visit uses Server rendering (fast, no download), and subsequent visits use WASM (downloaded and cached in the background during the first visit). Users get responsive first-load AND offline-capable repeat visits.
Performance Comparison
| Metric | Blazor Server | Blazor WASM | Blazor Hybrid |
|---|---|---|---|
| Initial load time | Fast — HTML only | Slower — 6–15 MB WASM | Fast — native install |
| UI interaction speed | Network-dependent | Instant — browser-local | Instant — device-local |
| Offline support | None | Full PWA | Full native |
| Server resource use | High — per-circuit memory | Low — static files + API | Minimal — API only |
| Database access in components | Direct — EF Core inline | Via API only | Via API or local DB |
| Code exposure risk | None — server only | WASM is decompilable | None — native binary |
Decision Matrix: Which Model for Your App?
Blazor vs React in 2026: The Honest Answer
The question we hear most in enterprise .NET teams is "should we use Blazor or React?" The honest answer: it depends on who's building it and what you're building.
If your team is predominantly C# developers who occasionally write JavaScript, Blazor wins on velocity. No context switching, no separate JS/TypeScript build pipeline, no JS fatigue, type-safe everything from database to UI. The learning curve for senior .NET developers is a week, not a quarter.
If you're building a consumer-grade SPA with complex animations, a rich ecosystem of third-party UI components, or a team that's primarily frontend-focused, React still has the broader ecosystem and more UI library options. The component ecosystem for Blazor (Telerik, Radzen, MudBlazor, Syncfusion) is solid for enterprise scenarios but doesn't match npm's breadth.
Our practical recommendation: use Blazor for internal enterprise tools (portals, admin screens, dashboards) where your team is .NET-first. Use React for customer-facing SaaS products where UI polish and third-party integrations are critical.
Getting Started: Project Structure for the Web App Model
MySolution/
├── MyApp.Client/ # Blazor WASM project (browser-side components)
│ └── Pages/
│ └── Counter.razor # @rendermode InteractiveWebAssembly
├── MyApp.Server/ # ASP.NET Core host + Blazor Server components
│ └── Pages/
│ └── Dashboard.razor # @rendermode InteractiveServer
├── MyApp.Shared/ # Razor Class Library — shared components
│ └── Components/
│ └── DataGrid.razor # No render mode — used by both
└── MyApp.Api/ # Web API for WASM to call
The @rendermode directive lives in the component, not the project structure. Start with Server mode for most pages, profile for latency issues, and migrate individual components to WASM if needed — without restructuring your whole application.
Summary
Blazor in 2026 is a serious choice for enterprise .NET teams. The three models serve genuinely different scenarios:
- Blazor Server: Intranet apps, data-heavy dashboards, rapid development with EF Core direct access. Scale with Azure SignalR Service.
- Blazor WASM: Customer-facing portals, offline PWAs, geographically distributed users. Use AoT + trimming to manage size.
- Blazor Hybrid: Desktop/mobile apps sharing UI with a Blazor web app. Best when your team is .NET-native and you need native device APIs.
- Blazor United (Auto mode): New default. Server on first load, WASM thereafter. Best of both for most new projects starting on .NET 8+.
If you're starting a new enterprise web app in 2026 and your team is .NET, Blazor is no longer the "interesting experiment" choice — it's a defensible production decision. The tooling, ecosystem, and Microsoft investment are all there.