diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor index a599117..5fe7c5c 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor @@ -232,8 +232,18 @@ else _acls = await AclSvc.ListAsync(GenerationId, CancellationToken.None); await InvokeAsync(StateHasChanged); }); - await _hub.StartAsync(); - await _hub.SendAsync("SubscribeCluster", ClusterId); + // Best-effort: FleetStatusHub requires an authenticated caller, and the server-side + // HubConnection cannot forward the browser auth cookie — swallow connect failures so + // the tab still renders. Live ACL-change updates degrade. + try + { + await _hub.StartAsync(); + await _hub.SendAsync("SubscribeCluster", ClusterId); + } + catch + { + // best-effort live updates — see comment above + } } public async ValueTask DisposeAsync() diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ClusterDetail.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ClusterDetail.razor index 4be8f20..afd02d4 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ClusterDetail.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ClusterDetail.razor @@ -192,8 +192,18 @@ else await InvokeAsync(StateHasChanged); }); - await _hub.StartAsync(); - await _hub.SendAsync("SubscribeCluster", ClusterId); + // Best-effort: FleetStatusHub requires an authenticated caller, and the server-side + // HubConnection cannot forward the browser auth cookie — a connect failure must not + // crash the page. Live banner updates degrade; the page still renders. + try + { + await _hub.StartAsync(); + await _hub.SendAsync("SubscribeCluster", ClusterId); + } + catch + { + // best-effort live updates — see comment above + } } private async Task CreateDraftAsync() diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor index 655113d..ad7240a 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor @@ -143,8 +143,18 @@ else await InvokeAsync(StateHasChanged); }); - await _hub.StartAsync(); - await _hub.SendAsync("SubscribeCluster", ClusterId); + // Best-effort: FleetStatusHub requires an authenticated caller, and the server-side + // HubConnection cannot forward the browser auth cookie — swallow connect failures so + // the tab still renders. Live role-change updates degrade. + try + { + await _hub.StartAsync(); + await _hub.SendAsync("SubscribeCluster", ClusterId); + } + catch + { + // best-effort live updates — see comment above + } } public async ValueTask DisposeAsync() diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/RoleGrants.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/RoleGrants.razor index e24e50d..68f3f27 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/RoleGrants.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/RoleGrants.razor @@ -180,8 +180,18 @@ else await ReloadAsync(); await InvokeAsync(StateHasChanged); }); - await _hub.StartAsync(); - await _hub.SendAsync("SubscribeFleet"); + // Best-effort: FleetStatusHub requires an authenticated caller, and the server-side + // HubConnection cannot forward the browser auth cookie — swallow connect failures so + // the page still renders. Live role-grant updates degrade. + try + { + await _hub.StartAsync(); + await _hub.SendAsync("SubscribeFleet"); + } + catch + { + // best-effort live updates — see comment above + } } public async ValueTask DisposeAsync()