From 6fa4c101abc085b3cbfb1bebcc488c8718c96a3f Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 17 Mar 2026 04:01:12 -0400 Subject: [PATCH] Fix blazor.web.js 404: move App.razor and Routes.razor to Host project Root cause: App.razor was in CentralUI (Microsoft.NET.Sdk.Razor RCL) but MapRazorComponents().AddInteractiveServerRenderMode() serves _framework/blazor.web.js from the host assembly (Microsoft.NET.Sdk.Web). Per MS docs, the root component must be in the server (host) project. - Move App.razor and Routes.razor from CentralUI to Host/Components/ - Add Host/_Imports.razor for Razor component usings - Make MapCentralUI generic: MapCentralUI() accepts root component - Add AdditionalAssemblies to discover CentralUI's pages/layouts - Routes.razor references both Host and CentralUI assemblies - Fix all DI registrations (TemplateEngine services) - SCADALINK_CONFIG env var for role-specific config loading Verified: blazor.web.js HTTP 200 (200KB), login page renders with Blazor interactive server mode, SignalR circuit establishes, LDAP auth works. --- src/ScadaLink.CentralUI/EndpointExtensions.cs | 14 +- src/ScadaLink.CentralUI/_Imports.razor | 1 + .../Components/App.razor | 51 +- src/ScadaLink.Host/Components/Routes.razor | 31 + src/ScadaLink.Host/Program.cs | 12 +- .../Properties/launchSettings.json | 10 +- src/ScadaLink.Host/_Imports.razor | 8 + .../logs/scadalink-20260317.log | 691 ++++++++++++++++++ .../ServiceCollectionExtensions.cs | 22 + 9 files changed, 788 insertions(+), 52 deletions(-) rename src/{ScadaLink.CentralUI => ScadaLink.Host}/Components/App.razor (58%) create mode 100644 src/ScadaLink.Host/Components/Routes.razor create mode 100644 src/ScadaLink.Host/_Imports.razor diff --git a/src/ScadaLink.CentralUI/EndpointExtensions.cs b/src/ScadaLink.CentralUI/EndpointExtensions.cs index a231d8d..e5fb009 100644 --- a/src/ScadaLink.CentralUI/EndpointExtensions.cs +++ b/src/ScadaLink.CentralUI/EndpointExtensions.cs @@ -1,18 +1,24 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Routing; using ScadaLink.CentralUI.Auth; -using ScadaLink.CentralUI.Components; +using ScadaLink.CentralUI.Components.Layout; namespace ScadaLink.CentralUI; public static class EndpointExtensions { - public static IEndpointRouteBuilder MapCentralUI(this IEndpointRouteBuilder endpoints) + /// + /// Maps the Central UI endpoints. The caller must provide the root App component type + /// from the Host assembly so that blazor.web.js is served correctly. + /// + public static IEndpointRouteBuilder MapCentralUI(this IEndpointRouteBuilder endpoints) + where TApp : Microsoft.AspNetCore.Components.IComponent { endpoints.MapAuthEndpoints(); - endpoints.MapRazorComponents() - .AddInteractiveServerRenderMode(); + endpoints.MapRazorComponents() + .AddInteractiveServerRenderMode() + .AddAdditionalAssemblies(typeof(MainLayout).Assembly); return endpoints; } diff --git a/src/ScadaLink.CentralUI/_Imports.razor b/src/ScadaLink.CentralUI/_Imports.razor index 7c5491f..c7695c0 100644 --- a/src/ScadaLink.CentralUI/_Imports.razor +++ b/src/ScadaLink.CentralUI/_Imports.razor @@ -4,6 +4,7 @@ @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode @using ScadaLink.CentralUI @using ScadaLink.CentralUI.Components.Layout @using ScadaLink.CentralUI.Components.Shared diff --git a/src/ScadaLink.CentralUI/Components/App.razor b/src/ScadaLink.Host/Components/App.razor similarity index 58% rename from src/ScadaLink.CentralUI/Components/App.razor rename to src/ScadaLink.Host/Components/App.razor index 416a4b8..ad950ba 100644 --- a/src/ScadaLink.CentralUI/Components/App.razor +++ b/src/ScadaLink.Host/Components/App.razor @@ -65,39 +65,10 @@ border-radius: 0.5rem; } - + - - - - - - @if (context.User.Identity?.IsAuthenticated != true) - { - - } - else - { - - } - - -

Checking authorization...

-
-
-
- - -
-

Page Not Found

-

The requested page does not exist.

- Return to Dashboard -
-
-
-
-
+
- +