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<App>().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<TApp>() 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.
This commit is contained in:
Joseph Doherty
2026-03-17 04:01:12 -04:00
parent 0b10747bd2
commit 6fa4c101ab
9 changed files with 788 additions and 52 deletions

View File

@@ -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)
/// <summary>
/// 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.
/// </summary>
public static IEndpointRouteBuilder MapCentralUI<TApp>(this IEndpointRouteBuilder endpoints)
where TApp : Microsoft.AspNetCore.Components.IComponent
{
endpoints.MapAuthEndpoints();
endpoints.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
endpoints.MapRazorComponents<TApp>()
.AddInteractiveServerRenderMode()
.AddAdditionalAssemblies(typeof(MainLayout).Assembly);
return endpoints;
}

View File

@@ -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

View File

@@ -65,39 +65,10 @@
border-radius: 0.5rem;
}
</style>
<HeadOutlet />
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<CascadingAuthenticationState>
<Router AppAssembly="typeof(App).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(MainLayout)">
<NotAuthorized>
@if (context.User.Identity?.IsAuthenticated != true)
{
<RedirectToLogin />
}
else
{
<NotAuthorizedView />
}
</NotAuthorized>
<Authorizing>
<p class="text-muted p-3">Checking authorization...</p>
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="typeof(MainLayout)">
<div class="container mt-5">
<h3>Page Not Found</h3>
<p class="text-muted">The requested page does not exist.</p>
<a href="/" class="btn btn-outline-primary btn-sm">Return to Dashboard</a>
</div>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
<Routes @rendermode="InteractiveServer" />
<div id="reconnect-modal">
<div class="modal-dialog">
@@ -111,18 +82,14 @@
</div>
</div>
<script src="_framework/blazor.server.js"></script>
<script src="_framework/blazor.web.js"></script>
<script>
Blazor.defaultReconnectionHandler._reconnectCallback = function (d) {
document.getElementById('reconnect-modal').style.display = 'block';
};
Blazor.defaultReconnectionHandler._reconnectedCallback = function (d) {
document.getElementById('reconnect-modal').style.display = 'none';
};
Blazor.defaultReconnectionHandler._reconnectionFailedCallback = function (d) {
document.getElementById('reconnect-modal').querySelector('p').textContent =
'Unable to reconnect. Please refresh the page.';
};
// Reconnection overlay for failover behavior
if (Blazor) {
Blazor.addEventListener('enhancedload', () => {
document.getElementById('reconnect-modal').style.display = 'none';
});
}
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"

View File

@@ -0,0 +1,31 @@
<CascadingAuthenticationState>
<Router AppAssembly="typeof(Routes).Assembly"
AdditionalAssemblies="new[] { typeof(ScadaLink.CentralUI.Components.Layout.MainLayout).Assembly }">
<Found Context="routeData">
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(ScadaLink.CentralUI.Components.Layout.MainLayout)">
<NotAuthorized>
@if (context.User.Identity?.IsAuthenticated != true)
{
<RedirectToLogin />
}
else
{
<NotAuthorizedView />
}
</NotAuthorized>
<Authorizing>
<p class="text-muted p-3">Checking authorization...</p>
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="typeof(ScadaLink.CentralUI.Components.Layout.MainLayout)">
<div class="container mt-5">
<h3>Page Not Found</h3>
<p class="text-muted">The requested page does not exist.</p>
<a href="/" class="btn btn-outline-primary btn-sm">Return to Dashboard</a>
</div>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

View File

@@ -20,9 +20,15 @@ using ScadaLink.StoreAndForward;
using ScadaLink.TemplateEngine;
using Serilog;
// SCADALINK_CONFIG determines which role-specific config to load (Central or Site)
// DOTNET_ENVIRONMENT/ASPNETCORE_ENVIRONMENT stay as "Development" for dev tooling (static assets, EF migrations, etc.)
var scadalinkConfig = Environment.GetEnvironmentVariable("SCADALINK_CONFIG")
?? Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")
?? "Production";
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddJsonFile($"appsettings.{scadalinkConfig}.json", optional: true)
.AddEnvironmentVariables()
.AddCommandLine(args)
.Build();
@@ -110,6 +116,8 @@ try
// Middleware pipeline
app.UseStaticFiles();
app.UseWebSockets();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
@@ -120,7 +128,7 @@ try
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
app.MapCentralUI();
app.MapCentralUI<ScadaLink.Host.Components.App>();
app.MapInboundAPI();
await app.RunAsync();
}

View File

@@ -7,8 +7,9 @@
"launchUrl": "",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Central",
"ASPNETCORE_ENVIRONMENT": "Development"
"DOTNET_ENVIRONMENT": "Development",
"ASPNETCORE_ENVIRONMENT": "Development",
"SCADALINK_CONFIG": "Central"
}
},
"ScadaLink Site": {
@@ -16,8 +17,9 @@
"dotnetRunMessages": true,
"launchBrowser": false,
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Site",
"ASPNETCORE_ENVIRONMENT": "Development"
"DOTNET_ENVIRONMENT": "Development",
"ASPNETCORE_ENVIRONMENT": "Development",
"SCADALINK_CONFIG": "Site"
}
}
}

View File

@@ -0,0 +1,8 @@
@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@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.Components.Shared

View File

@@ -2463,3 +2463,694 @@ DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:41:08.328 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:41:08.329 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.5353ms
2026-03-17 03:41:08.329 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:46:36.898 -04:00 [INF] Application is shutting down...
2026-03-17 03:46:36.899 -04:00 [INF] Shutting down Akka.NET actor system via CoordinatedShutdown...
2026-03-17 03:46:36.899 -04:00 [INF] Akka.NET actor system shutdown complete.
2026-03-17 03:46:40.349 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 03:46:40.841 -04:00 [INF] Executed DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:46:40.846 -04:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-03-17 03:46:40.862 -04:00 [INF] Executed DbCommand (14ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session', @LockMode = 'Exclusive';
SELECT @result
2026-03-17 03:46:40.909 -04:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
END;
2026-03-17 03:46:40.919 -04:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:46:40.921 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
2026-03-17 03:46:40.924 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
2026-03-17 03:46:40.927 -04:00 [INF] No migrations were applied. The database is already up to date.
2026-03-17 03:46:40.932 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_releaseapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session';
SELECT @result
2026-03-17 03:46:40.948 -04:00 [INF] Central health aggregator started, offline timeout 60s
2026-03-17 03:46:41.018 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [d].[Id], [d].[FriendlyName], [d].[Xml]
FROM [DataProtectionKeys] AS [d]
2026-03-17 03:46:41.115 -04:00 [INF] Akka.NET actor system 'scadalink' started. Role=Central, Roles=Central, Hostname=localhost, Port=8081, TransportHeartbeat=5s, TransportFailure=15s
2026-03-17 03:46:41.116 -04:00 [INF] Central actors registered. CentralCommunicationActor created.
2026-03-17 03:46:41.303 -04:00 [WRN] The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert
2026-03-17 03:46:41.307 -04:00 [INF] Now listening on: https://localhost:5001
2026-03-17 03:46:41.307 -04:00 [INF] Now listening on: http://localhost:5000
2026-03-17 03:46:41.308 -04:00 [INF] Application started. Press Ctrl+C to shut down.
2026-03-17 03:46:41.308 -04:00 [INF] Hosting environment: Central
2026-03-17 03:46:41.308 -04:00 [INF] Content root path: /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host
2026-03-17 03:46:50.876 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:46:50.892 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:46:50.914 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:50.914 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:50.934 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:46:50.935 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 59.0316ms
2026-03-17 03:46:50.950 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:46:50.951 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:46:50.953 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 2.6152ms
2026-03-17 03:46:50.953 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 1.6717ms
2026-03-17 03:46:50.953 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:46:50.953 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:46:53.882 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:46:53.885 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:46:53.888 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:53.888 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:53.889 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:46:53.889 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 6.8232ms
2026-03-17 03:46:53.900 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:46:53.900 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.3519ms
2026-03-17 03:46:53.900 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:46:53.902 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:46:53.902 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 0.2747ms
2026-03-17 03:46:53.902 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:46:53.964 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/favicon.ico - null null
2026-03-17 03:46:53.965 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/favicon.ico - 404 0 null 0.2729ms
2026-03-17 03:46:53.965 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/favicon.ico, Response status code: 404
2026-03-17 03:46:57.452 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:46:57.454 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:46:57.469 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:57.469 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:57.470 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:46:57.471 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 18.5746ms
2026-03-17 03:46:57.483 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:46:57.483 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.4502ms
2026-03-17 03:46:57.484 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:46:57.484 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:46:57.484 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 0.2903ms
2026-03-17 03:46:57.484 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:46:57.532 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/favicon.ico - null null
2026-03-17 03:46:57.533 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/favicon.ico - 404 0 null 0.4896ms
2026-03-17 03:46:57.533 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/favicon.ico, Response status code: 404
2026-03-17 03:46:57.906 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/health/ready - null null
2026-03-17 03:46:57.907 -04:00 [INF] Executing endpoint 'Health checks'
2026-03-17 03:46:57.931 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:46:57.940 -04:00 [INF] Executed endpoint 'Health checks'
2026-03-17 03:46:57.940 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/health/ready - 200 null application/json 34.2787ms
2026-03-17 03:46:57.951 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - null null
2026-03-17 03:46:57.951 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - 404 0 null 0.2485ms
2026-03-17 03:46:57.951 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://localhost:5000/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:46:57.959 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - null null
2026-03-17 03:46:57.959 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - 404 0 null 0.1912ms
2026-03-17 03:46:57.959 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://localhost:5000/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:46:57.966 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/login - null null
2026-03-17 03:46:57.966 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:46:57.967 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:57.967 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:57.968 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:46:57.968 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/login - 200 null text/html; charset=utf-8 1.6678ms
2026-03-17 03:46:57.975 -04:00 [INF] Request starting HTTP/1.1 POST http://localhost:5000/auth/login - application/x-www-form-urlencoded 32
2026-03-17 03:46:57.975 -04:00 [INF] Executing endpoint 'HTTP: POST /auth/login'
2026-03-17 03:46:58.017 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [l].[Id], [l].[LdapGroupName], [l].[Role]
FROM [LdapGroupMappings] AS [l]
2026-03-17 03:46:58.027 -04:00 [INF] AuthenticationScheme: Cookies signed in.
2026-03-17 03:46:58.027 -04:00 [INF] Executed endpoint 'HTTP: POST /auth/login'
2026-03-17 03:46:58.027 -04:00 [INF] Request finished HTTP/1.1 POST http://localhost:5000/auth/login - 302 0 null 51.6167ms
2026-03-17 03:46:58.041 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - null null
2026-03-17 03:46:58.042 -04:00 [INF] Executing endpoint '/ (/)'
2026-03-17 03:46:58.045 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:58.046 -04:00 [INF] Executed endpoint '/ (/)'
2026-03-17 03:46:58.046 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - 302 null text/html; charset=utf-8 5.0896ms
2026-03-17 03:46:58.056 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/admin/ldap-mappings - null null
2026-03-17 03:46:58.057 -04:00 [INF] Authorization failed. These requirements were not met:
ClaimsAuthorizationRequirement:Claim.Type=Role and Claim.Value is one of the following values: (Admin)
2026-03-17 03:46:58.057 -04:00 [INF] AuthenticationScheme: Cookies was forbidden.
2026-03-17 03:46:58.057 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/admin/ldap-mappings - 302 0 null 1.3493ms
2026-03-17 03:46:58.065 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - null null
2026-03-17 03:46:58.066 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:46:58.067 -04:00 [INF] AuthenticationScheme: Cookies was challenged.
2026-03-17 03:46:58.067 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - 302 0 null 1.1908ms
2026-03-17 03:48:36.167 -04:00 [INF] Application is shutting down...
2026-03-17 03:48:36.169 -04:00 [INF] Shutting down Akka.NET actor system via CoordinatedShutdown...
2026-03-17 03:48:36.169 -04:00 [INF] Akka.NET actor system shutdown complete.
2026-03-17 03:48:39.051 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 03:48:39.170 -04:00 [FTL] ScadaLink host terminated unexpectedly
System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.IFlatteningPipeline Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.FlatteningPipeline': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.) (Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.DeploymentService Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.DeploymentService': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.)
---> System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.IFlatteningPipeline Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.FlatteningPipeline': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
---> System.InvalidOperationException: Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateExact(ServiceDescriptor descriptor, ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
at Microsoft.Extensions.Hosting.HostApplicationBuilder.Build()
at Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build()
at Program.<Main>$(String[] args) in /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host/Program.cs:line 103
---> (Inner Exception #1) System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.DeploymentService Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.DeploymentService': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
---> System.InvalidOperationException: Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateExact(ServiceDescriptor descriptor, ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateExact(ServiceDescriptor descriptor, ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)<---
2026-03-17 03:49:09.265 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 03:49:09.419 -04:00 [FTL] ScadaLink host terminated unexpectedly
System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.IFlatteningPipeline Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.FlatteningPipeline': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.) (Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.DeploymentService Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.DeploymentService': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.)
---> System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.IFlatteningPipeline Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.FlatteningPipeline': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
---> System.InvalidOperationException: Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateExact(ServiceDescriptor descriptor, ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
at Microsoft.Extensions.Hosting.HostApplicationBuilder.Build()
at Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build()
at Program.<Main>$(String[] args) in /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host/Program.cs:line 103
---> (Inner Exception #1) System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: ScadaLink.DeploymentManager.DeploymentService Lifetime: Scoped ImplementationType: ScadaLink.DeploymentManager.DeploymentService': Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
---> System.InvalidOperationException: Unable to resolve service for type 'ScadaLink.TemplateEngine.Flattening.FlatteningService' while attempting to activate 'ScadaLink.DeploymentManager.FlatteningPipeline'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateExact(ServiceDescriptor descriptor, ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, ServiceIdentifier serviceIdentifier, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateExact(ServiceDescriptor descriptor, ServiceIdentifier serviceIdentifier, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)<---
2026-03-17 03:51:33.450 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 03:51:34.061 -04:00 [INF] Executed DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:51:34.067 -04:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-03-17 03:51:34.086 -04:00 [INF] Executed DbCommand (18ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session', @LockMode = 'Exclusive';
SELECT @result
2026-03-17 03:51:34.133 -04:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
END;
2026-03-17 03:51:34.142 -04:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:51:34.146 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
2026-03-17 03:51:34.149 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
2026-03-17 03:51:34.152 -04:00 [INF] No migrations were applied. The database is already up to date.
2026-03-17 03:51:34.156 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_releaseapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session';
SELECT @result
2026-03-17 03:51:34.171 -04:00 [INF] Central health aggregator started, offline timeout 60s
2026-03-17 03:51:34.247 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [d].[Id], [d].[FriendlyName], [d].[Xml]
FROM [DataProtectionKeys] AS [d]
2026-03-17 03:51:34.362 -04:00 [INF] Akka.NET actor system 'scadalink' started. Role=Central, Roles=Central, Hostname=localhost, Port=8081, TransportHeartbeat=5s, TransportFailure=15s
2026-03-17 03:51:34.363 -04:00 [INF] Central actors registered. CentralCommunicationActor created.
2026-03-17 03:51:34.416 -04:00 [INF] Now listening on: http://localhost:5000
2026-03-17 03:51:34.419 -04:00 [INF] Application started. Press Ctrl+C to shut down.
2026-03-17 03:51:34.419 -04:00 [INF] Hosting environment: Development
2026-03-17 03:51:34.419 -04:00 [INF] Content root path: /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host
2026-03-17 03:51:45.968 -04:00 [INF] Application is shutting down...
2026-03-17 03:51:45.972 -04:00 [INF] Shutting down Akka.NET actor system via CoordinatedShutdown...
2026-03-17 03:51:46.391 -04:00 [INF] Akka.NET actor system shutdown complete.
2026-03-17 03:53:39.487 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 03:53:40.030 -04:00 [INF] Executed DbCommand (13ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:53:40.036 -04:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-03-17 03:53:40.052 -04:00 [INF] Executed DbCommand (15ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session', @LockMode = 'Exclusive';
SELECT @result
2026-03-17 03:53:40.103 -04:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
END;
2026-03-17 03:53:40.114 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:53:40.117 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
2026-03-17 03:53:40.122 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
2026-03-17 03:53:40.125 -04:00 [INF] No migrations were applied. The database is already up to date.
2026-03-17 03:53:40.130 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_releaseapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session';
SELECT @result
2026-03-17 03:53:40.144 -04:00 [INF] Central health aggregator started, offline timeout 60s
2026-03-17 03:53:40.222 -04:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [d].[Id], [d].[FriendlyName], [d].[Xml]
FROM [DataProtectionKeys] AS [d]
2026-03-17 03:53:40.334 -04:00 [INF] Akka.NET actor system 'scadalink' started. Role=Central, Roles=Central, Hostname=localhost, Port=8081, TransportHeartbeat=5s, TransportFailure=15s
2026-03-17 03:53:40.334 -04:00 [INF] Central actors registered. CentralCommunicationActor created.
2026-03-17 03:53:40.538 -04:00 [WRN] The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert
2026-03-17 03:53:40.543 -04:00 [INF] Now listening on: https://localhost:5001
2026-03-17 03:53:40.543 -04:00 [INF] Now listening on: http://localhost:5000
2026-03-17 03:53:40.543 -04:00 [INF] Application started. Press Ctrl+C to shut down.
2026-03-17 03:53:40.543 -04:00 [INF] Hosting environment: Development
2026-03-17 03:53:40.543 -04:00 [INF] Content root path: /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host
2026-03-17 03:53:48.857 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:53:48.871 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:53:48.897 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:48.898 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:48.919 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:53:48.920 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 64.1806ms
2026-03-17 03:53:48.934 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:53:48.934 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:53:48.936 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 2.1463ms
2026-03-17 03:53:48.936 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 2.148ms
2026-03-17 03:53:48.937 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:53:48.937 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:53:51.604 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:53:51.611 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:53:51.620 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:51.620 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:51.624 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:53:51.625 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 21.9111ms
2026-03-17 03:53:51.639 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:53:51.640 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:53:51.640 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.501ms
2026-03-17 03:53:51.640 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 0.2984ms
2026-03-17 03:53:51.640 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:53:51.640 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:53:53.079 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:53:53.080 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:53:53.085 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:53.085 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:53.086 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:53:53.086 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 6.861ms
2026-03-17 03:53:53.101 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:53:53.101 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.3938ms
2026-03-17 03:53:53.101 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:53:53.103 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:53:53.103 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 0.2432ms
2026-03-17 03:53:53.103 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:53:54.270 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:53:54.270 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:53:54.272 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:54.273 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:54.274 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:53:54.274 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 4.875ms
2026-03-17 03:53:54.291 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:53:54.292 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.4626ms
2026-03-17 03:53:54.292 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:53:54.294 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:53:54.295 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 0.49ms
2026-03-17 03:53:54.295 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:53:56.551 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 03:53:56.551 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:53:56.553 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:56.553 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:56.554 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:53:56.555 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 5.0652ms
2026-03-17 03:53:56.573 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 03:53:56.575 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 1.8841ms
2026-03-17 03:53:56.576 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 03:53:56.576 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 03:53:56.576 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 404 0 null 0.4484ms
2026-03-17 03:53:56.577 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:53:57.110 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/health/ready - null null
2026-03-17 03:53:57.111 -04:00 [INF] Executing endpoint 'Health checks'
2026-03-17 03:53:57.136 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:53:57.146 -04:00 [INF] Executed endpoint 'Health checks'
2026-03-17 03:53:57.146 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/health/ready - 200 null application/json 35.7451ms
2026-03-17 03:53:57.156 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - null null
2026-03-17 03:53:57.156 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - 404 0 null 0.2456ms
2026-03-17 03:53:57.156 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://localhost:5000/_framework/blazor.web.js, Response status code: 404
2026-03-17 03:53:57.163 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/login - null null
2026-03-17 03:53:57.163 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:53:57.164 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:57.164 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:57.165 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:53:57.165 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/login - 200 null text/html; charset=utf-8 1.4402ms
2026-03-17 03:53:57.173 -04:00 [INF] Request starting HTTP/1.1 POST http://localhost:5000/auth/login - application/x-www-form-urlencoded 32
2026-03-17 03:53:57.173 -04:00 [INF] Executing endpoint 'HTTP: POST /auth/login'
2026-03-17 03:53:57.221 -04:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [l].[Id], [l].[LdapGroupName], [l].[Role]
FROM [LdapGroupMappings] AS [l]
2026-03-17 03:53:57.231 -04:00 [INF] AuthenticationScheme: Cookies signed in.
2026-03-17 03:53:57.231 -04:00 [INF] Executed endpoint 'HTTP: POST /auth/login'
2026-03-17 03:53:57.231 -04:00 [INF] Request finished HTTP/1.1 POST http://localhost:5000/auth/login - 302 0 null 58.9219ms
2026-03-17 03:53:57.246 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - null null
2026-03-17 03:53:57.247 -04:00 [INF] Executing endpoint '/ (/)'
2026-03-17 03:53:57.254 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:53:57.255 -04:00 [INF] Executed endpoint '/ (/)'
2026-03-17 03:53:57.255 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - 302 null text/html; charset=utf-8 8.7595ms
2026-03-17 03:59:15.379 -04:00 [INF] Application is shutting down...
2026-03-17 03:59:15.381 -04:00 [INF] Shutting down Akka.NET actor system via CoordinatedShutdown...
2026-03-17 03:59:15.381 -04:00 [INF] Akka.NET actor system shutdown complete.
2026-03-17 03:59:49.131 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 03:59:49.714 -04:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:59:49.718 -04:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-03-17 03:59:49.737 -04:00 [INF] Executed DbCommand (18ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session', @LockMode = 'Exclusive';
SELECT @result
2026-03-17 03:59:49.781 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
END;
2026-03-17 03:59:49.791 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 03:59:49.794 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
2026-03-17 03:59:49.798 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
2026-03-17 03:59:49.801 -04:00 [INF] No migrations were applied. The database is already up to date.
2026-03-17 03:59:49.805 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_releaseapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session';
SELECT @result
2026-03-17 03:59:49.819 -04:00 [INF] Central health aggregator started, offline timeout 60s
2026-03-17 03:59:49.896 -04:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [d].[Id], [d].[FriendlyName], [d].[Xml]
FROM [DataProtectionKeys] AS [d]
2026-03-17 03:59:50.003 -04:00 [INF] Akka.NET actor system 'scadalink' started. Role=Central, Roles=Central, Hostname=localhost, Port=8081, TransportHeartbeat=5s, TransportFailure=15s
2026-03-17 03:59:50.004 -04:00 [INF] Central actors registered. CentralCommunicationActor created.
2026-03-17 03:59:50.050 -04:00 [INF] Now listening on: http://localhost:5050
2026-03-17 03:59:50.050 -04:00 [INF] Application started. Press Ctrl+C to shut down.
2026-03-17 03:59:50.050 -04:00 [INF] Hosting environment: Development
2026-03-17 03:59:50.050 -04:00 [INF] Content root path: /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host
2026-03-17 03:59:51.082 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5050/ - null null
2026-03-17 03:59:51.094 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:59:51.095 -04:00 [INF] AuthenticationScheme: Cookies was challenged.
2026-03-17 03:59:51.096 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5050/ - 302 0 null 14.0528ms
2026-03-17 03:59:51.104 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5050/_framework/blazor.web.js - null null
2026-03-17 03:59:51.109 -04:00 [INF] Sending file. Request path: '/_framework/blazor.web.js'. Physical path: '/Users/dohertj2/.nuget/packages/microsoft.aspnetcore.app.internal.assets/10.0.1/_framework/blazor.web.js'
2026-03-17 03:59:51.110 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5050/_framework/blazor.web.js - 200 200101 text/javascript 5.5184ms
2026-03-17 03:59:51.116 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5050/login - null null
2026-03-17 03:59:51.118 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 03:59:51.139 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:59:51.139 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 03:59:51.158 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 03:59:51.159 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5050/login - 200 null text/html; charset=utf-8 43.2547ms
2026-03-17 03:59:51.177 -04:00 [INF] Application is shutting down...
2026-03-17 03:59:51.179 -04:00 [INF] Shutting down Akka.NET actor system via CoordinatedShutdown...
2026-03-17 03:59:51.179 -04:00 [INF] Akka.NET actor system shutdown complete.
2026-03-17 04:00:36.359 -04:00 [INF] Starting ScadaLink host as Central on localhost
2026-03-17 04:00:36.896 -04:00 [INF] Executed DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 04:00:36.901 -04:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-03-17 04:00:36.916 -04:00 [INF] Executed DbCommand (14ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session', @LockMode = 'Exclusive';
SELECT @result
2026-03-17 04:00:36.962 -04:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
END;
2026-03-17 04:00:36.971 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 04:00:36.973 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
2026-03-17 04:00:37.009 -04:00 [INF] Executed DbCommand (34ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
2026-03-17 04:00:37.013 -04:00 [INF] No migrations were applied. The database is already up to date.
2026-03-17 04:00:37.019 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DECLARE @result int;
EXEC @result = sp_releaseapplock @Resource = '__EFMigrationsLock', @LockOwner = 'Session';
SELECT @result
2026-03-17 04:00:37.033 -04:00 [INF] Central health aggregator started, offline timeout 60s
2026-03-17 04:00:37.109 -04:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [d].[Id], [d].[FriendlyName], [d].[Xml]
FROM [DataProtectionKeys] AS [d]
2026-03-17 04:00:37.220 -04:00 [INF] Akka.NET actor system 'scadalink' started. Role=Central, Roles=Central, Hostname=localhost, Port=8081, TransportHeartbeat=5s, TransportFailure=15s
2026-03-17 04:00:37.221 -04:00 [INF] Central actors registered. CentralCommunicationActor created.
2026-03-17 04:00:37.409 -04:00 [WRN] The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert
2026-03-17 04:00:37.414 -04:00 [INF] Now listening on: https://localhost:5001
2026-03-17 04:00:37.414 -04:00 [INF] Now listening on: http://localhost:5000
2026-03-17 04:00:37.414 -04:00 [INF] Application started. Press Ctrl+C to shut down.
2026-03-17 04:00:37.414 -04:00 [INF] Hosting environment: Development
2026-03-17 04:00:37.414 -04:00 [INF] Content root path: /Users/dohertj2/Desktop/scadalink-design/src/ScadaLink.Host
2026-03-17 04:00:40.586 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 04:00:40.602 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 04:00:40.628 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:40.628 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:40.651 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 04:00:40.652 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 66.5449ms
2026-03-17 04:00:40.667 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 04:00:40.667 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - null null
2026-03-17 04:00:40.669 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 1.684ms
2026-03-17 04:00:40.669 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 04:00:40.673 -04:00 [INF] Sending file. Request path: '/_framework/blazor.web.js'. Physical path: '/Users/dohertj2/.nuget/packages/microsoft.aspnetcore.app.internal.assets/10.0.1/_framework/blazor.web.js'
2026-03-17 04:00:40.673 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_framework/blazor.web.js - 200 200101 text/javascript 5.2171ms
2026-03-17 04:00:40.719 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_blazor/initializers - null null
2026-03-17 04:00:40.720 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:40.721 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:40.721 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_blazor/initializers - 200 null application/json; charset=utf-8 2.3421ms
2026-03-17 04:00:40.725 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - null 0
2026-03-17 04:00:40.725 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:40.727 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:40.727 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - 200 316 application/json 2.1131ms
2026-03-17 04:00:40.729 -04:00 [INF] Request starting HTTP/2 CONNECT https://localhost:5001/_blazor?id=vTWrrNqvjg46PaW166RPCw - null null
2026-03-17 04:00:40.729 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:40.771 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:40.771 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:43.532 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 04:00:43.534 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 04:00:43.551 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:43.551 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:43.554 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 04:00:43.554 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 21.9468ms
2026-03-17 04:00:43.565 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/disconnect - multipart/form-data; boundary=----WebKitFormBoundaryRxet0GnMrCRavLlv 359
2026-03-17 04:00:43.566 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.572 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 04:00:43.572 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.6181ms
2026-03-17 04:00:43.572 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 04:00:43.574 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.574 -04:00 [INF] Request finished HTTP/2 CONNECT https://localhost:5001/_blazor?id=vTWrrNqvjg46PaW166RPCw - 200 null null 2845.1985ms
2026-03-17 04:00:43.576 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.576 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/disconnect - 200 0 null 10.2715ms
2026-03-17 04:00:43.627 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_blazor/initializers - null null
2026-03-17 04:00:43.628 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.629 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.629 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_blazor/initializers - 200 null application/json; charset=utf-8 1.9517ms
2026-03-17 04:00:43.632 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - null 0
2026-03-17 04:00:43.632 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.632 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.633 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - 200 316 application/json 0.967ms
2026-03-17 04:00:43.634 -04:00 [INF] Request starting HTTP/2 CONNECT https://localhost:5001/_blazor?id=dMzY_ahpcn2fbL6x_EqNMg - null null
2026-03-17 04:00:43.634 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:43.654 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:43.655 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:46.190 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 04:00:46.191 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 04:00:46.194 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:46.195 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:46.195 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 04:00:46.196 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 5.6039ms
2026-03-17 04:00:46.202 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/disconnect - multipart/form-data; boundary=----WebKitFormBoundaryPTs6NwsgVevWubiQ 359
2026-03-17 04:00:46.202 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.202 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.202 -04:00 [INF] Request finished HTTP/2 CONNECT https://localhost:5001/_blazor?id=dMzY_ahpcn2fbL6x_EqNMg - 200 null null 2568.053ms
2026-03-17 04:00:46.203 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.203 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/disconnect - 200 0 null 1.006ms
2026-03-17 04:00:46.205 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 04:00:46.206 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.3777ms
2026-03-17 04:00:46.206 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 04:00:46.214 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_blazor/initializers - null null
2026-03-17 04:00:46.214 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.215 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.215 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_blazor/initializers - 200 null application/json; charset=utf-8 0.4446ms
2026-03-17 04:00:46.247 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - null 0
2026-03-17 04:00:46.247 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.248 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.248 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - 200 316 application/json 0.7546ms
2026-03-17 04:00:46.249 -04:00 [INF] Request starting HTTP/2 CONNECT https://localhost:5001/_blazor?id=WCQuGE0sgUWVS6jVtxWhZw - null null
2026-03-17 04:00:46.249 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:46.258 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:46.259 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:47.963 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 04:00:47.963 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 04:00:47.964 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:47.964 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:47.965 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 04:00:47.965 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 1.6866ms
2026-03-17 04:00:47.978 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/disconnect - multipart/form-data; boundary=----WebKitFormBoundaryldZIGnnc0U9s49te 359
2026-03-17 04:00:47.978 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:47.978 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:47.978 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/disconnect - 200 0 null 0.8246ms
2026-03-17 04:00:47.979 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:47.979 -04:00 [INF] Request finished HTTP/2 CONNECT https://localhost:5001/_blazor?id=WCQuGE0sgUWVS6jVtxWhZw - 200 null null 1729.8604ms
2026-03-17 04:00:47.983 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 04:00:47.983 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.3299ms
2026-03-17 04:00:47.983 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 04:00:47.998 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_blazor/initializers - null null
2026-03-17 04:00:47.998 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:47.998 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:47.998 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_blazor/initializers - 200 null application/json; charset=utf-8 0.3089ms
2026-03-17 04:00:48.034 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - null 0
2026-03-17 04:00:48.035 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:48.035 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:48.035 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - 200 316 application/json 0.3003ms
2026-03-17 04:00:48.037 -04:00 [INF] Request starting HTTP/2 CONNECT https://localhost:5001/_blazor?id=q6q-gdjyPnfNrS8QaTx2Yw - null null
2026-03-17 04:00:48.037 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:48.041 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:48.041 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:53.907 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/health/ready - null null
2026-03-17 04:00:53.907 -04:00 [INF] Executing endpoint 'Health checks'
2026-03-17 04:00:53.934 -04:00 [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT 1
2026-03-17 04:00:53.941 -04:00 [INF] Executed endpoint 'Health checks'
2026-03-17 04:00:53.941 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/health/ready - 200 null application/json 34.6988ms
2026-03-17 04:00:53.952 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - null null
2026-03-17 04:00:53.952 -04:00 [INF] Sending file. Request path: '/_framework/blazor.web.js'. Physical path: '/Users/dohertj2/.nuget/packages/microsoft.aspnetcore.app.internal.assets/10.0.1/_framework/blazor.web.js'
2026-03-17 04:00:53.952 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - 200 200101 text/javascript 0.8724ms
2026-03-17 04:00:53.959 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - null null
2026-03-17 04:00:53.960 -04:00 [INF] Sending file. Request path: '/_framework/blazor.web.js'. Physical path: '/Users/dohertj2/.nuget/packages/microsoft.aspnetcore.app.internal.assets/10.0.1/_framework/blazor.web.js'
2026-03-17 04:00:53.960 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/_framework/blazor.web.js - 200 200101 text/javascript 0.3707ms
2026-03-17 04:00:53.968 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/login - null null
2026-03-17 04:00:53.968 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 04:00:53.969 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:53.969 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:53.969 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 04:00:53.969 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/login - 200 null text/html; charset=utf-8 1.4599ms
2026-03-17 04:00:53.976 -04:00 [INF] Request starting HTTP/1.1 POST http://localhost:5000/auth/login - application/x-www-form-urlencoded 32
2026-03-17 04:00:53.976 -04:00 [INF] Executing endpoint 'HTTP: POST /auth/login'
2026-03-17 04:00:54.014 -04:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT [l].[Id], [l].[LdapGroupName], [l].[Role]
FROM [LdapGroupMappings] AS [l]
2026-03-17 04:00:54.024 -04:00 [INF] AuthenticationScheme: Cookies signed in.
2026-03-17 04:00:54.024 -04:00 [INF] Executed endpoint 'HTTP: POST /auth/login'
2026-03-17 04:00:54.024 -04:00 [INF] Request finished HTTP/1.1 POST http://localhost:5000/auth/login - 302 0 null 47.9516ms
2026-03-17 04:00:54.039 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - null null
2026-03-17 04:00:54.040 -04:00 [INF] Executing endpoint '/ (/)'
2026-03-17 04:00:54.045 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:54.046 -04:00 [INF] Executed endpoint '/ (/)'
2026-03-17 04:00:54.046 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - 302 null text/html; charset=utf-8 7.4769ms
2026-03-17 04:00:54.056 -04:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - null null
2026-03-17 04:00:54.057 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:54.058 -04:00 [INF] AuthenticationScheme: Cookies was challenged.
2026-03-17 04:00:54.058 -04:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - 302 0 null 1.1486ms
2026-03-17 04:00:55.515 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - null null
2026-03-17 04:00:55.516 -04:00 [INF] Executing endpoint '/login (/login)'
2026-03-17 04:00:55.518 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:55.518 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:55.519 -04:00 [INF] Executed endpoint '/login (/login)'
2026-03-17 04:00:55.520 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/login?ReturnUrl=%2F - 200 null text/html; charset=utf-8 4.3962ms
2026-03-17 04:00:55.533 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/disconnect - multipart/form-data; boundary=----WebKitFormBoundaryC2pR7L2m18MtA3qw 359
2026-03-17 04:00:55.533 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.533 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.533 -04:00 [INF] Request finished HTTP/2 CONNECT https://localhost:5001/_blazor?id=q6q-gdjyPnfNrS8QaTx2Yw - 200 null null 7496.4048ms
2026-03-17 04:00:55.534 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.534 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/disconnect - 200 0 null 0.8217ms
2026-03-17 04:00:55.538 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - null null
2026-03-17 04:00:55.539 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json - 404 0 null 0.3417ms
2026-03-17 04:00:55.539 -04:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET https://localhost:5001/.well-known/appspecific/com.chrome.devtools.json, Response status code: 404
2026-03-17 04:00:55.552 -04:00 [INF] Request starting HTTP/2 GET https://localhost:5001/_blazor/initializers - null null
2026-03-17 04:00:55.552 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.552 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.552 -04:00 [INF] Request finished HTTP/2 GET https://localhost:5001/_blazor/initializers - 200 null application/json; charset=utf-8 0.5708ms
2026-03-17 04:00:55.587 -04:00 [INF] Request starting HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - null 0
2026-03-17 04:00:55.588 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.588 -04:00 [INF] Executed endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.588 -04:00 [INF] Request finished HTTP/2 POST https://localhost:5001/_blazor/negotiate?negotiateVersion=1 - 200 316 application/json 0.6303ms
2026-03-17 04:00:55.590 -04:00 [INF] Request starting HTTP/2 CONNECT https://localhost:5001/_blazor?id=tDM6_Q8uUYnIXQUzmob9Ew - null null
2026-03-17 04:00:55.590 -04:00 [INF] Executing endpoint 'Microsoft.AspNetCore.Routing.RouteEndpoint'
2026-03-17 04:00:55.600 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
2026-03-17 04:00:55.600 -04:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.

View File

@@ -1,4 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using ScadaLink.TemplateEngine.Flattening;
using ScadaLink.TemplateEngine.Services;
using ScadaLink.TemplateEngine.Validation;
namespace ScadaLink.TemplateEngine;
@@ -9,6 +12,25 @@ public static class ServiceCollectionExtensions
services.AddScoped<TemplateService>();
services.AddScoped<SharedScriptService>();
// Flattening services (stateless utilities)
services.AddTransient<FlatteningService>();
services.AddTransient<DiffService>();
services.AddTransient<RevisionHashService>();
// Validation services (stateless utilities)
services.AddTransient<ScriptCompiler>();
services.AddTransient<SemanticValidator>();
services.AddTransient<ValidationService>();
// Domain services (depend on scoped DbContext / repositories)
services.AddScoped<InstanceService>();
services.AddScoped<SiteService>();
services.AddScoped<AreaService>();
services.AddScoped<TemplateDeletionService>();
// Note: CycleDetector, CollisionDetector, LockEnforcer, and TemplateResolver
// are static utility classes and do not require DI registration.
return services;
}