The Monitoring module provides real-time user session monitoring for XAF Blazor applications. Administrators can view active users, track session status, monitor activity, and access server diagnostics — all from a built-in Active Users view under the Administration navigation group.

This module is not designed to work with the DevExpress Multitenant module
Install-Package 'Llamachant.ExpressApp.Monitoring.Blazor'
Startup.cs
services.AddXaf(Configuration, builder => {
builder.UseApplication<ExpressAppBlazorApplication>();
builder.Modules.AddLlamachantFrameworkMonitoringBlazorModule();
});
Pass an options delegate to customize behavior:
builder.Modules.AddLlamachantFrameworkMonitoringBlazorModule(options => {
options.ShowSessionInfo = true;
options.ShowConnectionInfo = true;
options.ShowActivityInfo = true;
options.ShowServerInfo = true;
options.MaxActivityCount = 20;
options.MaxGlobalActivityCount = 100;
options.AllowTerminatingSessions = true;
options.AllowViewingRecentActions = true;
});
| Property | Default | Description |
|---|---|---|
ShowSessionInfo |
true |
Show session status, login time, duration, and idle time |
ShowConnectionInfo |
true |
Show IP address, browser info, connection count, and heartbeat |
ShowActivityInfo |
true |
Show current page, page views, action count, and activity timeline |
ShowServerInfo |
true |
Show server memory usage, GC memory, active session count, and uptime |
MaxActivityCount |
20 |
Maximum number of activity timeline entries per user session |
MaxGlobalActivityCount |
100 |
Maximum number of entries in the global recent action history |
AllowTerminatingSessions |
true |
Allow administrators to force-terminate user sessions |
AllowViewingRecentActions |
true |
Allow viewing the recent actions popup |
The module adds an Active Users ListView under the Administration navigation group. The view displays all connected user sessions and updates in real-time.
| Status | Description |
|---|---|
| Active | User is currently interacting with the application |
| Idle | User is connected but has been inactive for more than 5 minutes |
| Disconnected | User's circuit connection has been lost |
Disconnected sessions are automatically removed after 1 minute if the user does not reconnect. Stale disconnected sessions older than 5 minutes are cleaned up when the session list is retrieved.
The columns displayed depend on which option groups are enabled:
Always visible:
UserName — The logged-in user's nameSession Info (ShowSessionInfo):
Status — Active, Idle, or DisconnectedLoginTime — When the user logged inSessionDuration — How long the session has been activeIdleTime — How long since the user's last activityActivity Info (ShowActivityInfo):
CurrentPage — The page the user is currently viewingDouble-clicking a session opens a modal detail view with additional information based on enabled options:
Connection Info (ShowConnectionInfo):
IPAddress, BrowserInfo, ConnectionCount, LastHeartbeat, HeartbeatAgeActivity Info (ShowActivityInfo):
CurrentPage, PageViewCount, ActionCount, LastActivityTime, ActivityTimelineServer Diagnostics (ShowServerInfo):
ServerMemoryUsed, ServerGCMemory, TotalActiveSessions, ServerUptimeForcefully logs out the selected user. The user's circuit receives a termination callback and the session is ended immediately. Requires AllowTerminatingSessions = true and an authenticated user.
Opens a popup showing the most recent actions executed across all users. Useful for auditing user activity in real-time. Requires AllowViewingRecentActions = true.
The module registers the following services automatically:
| Service | Lifetime | Description |
|---|---|---|
ActiveUserService |
Singleton | Core service tracking all sessions, activity, and action history |
ActiveUserServiceOptions |
Singleton | Configuration options |
ConnectionInfoHolder |
Scoped | Captures IP address, browser info, and circuit ID per connection |
NavigationTracker |
Scoped | Tracks page navigation events per circuit |
MonitoredCircuitHandlerProxy |
Scoped | Intercepts Blazor circuit lifecycle events |
Note: The module replaces any previously registered
CircuitHandlerservices withMonitoredCircuitHandlerProxy, which delegates to the DevExpressIScopedCircuitHandlerinternally.
The ActiveUserService singleton can be resolved from DI for programmatic access:
| Method | Description |
|---|---|
UserConnected(circuitId, userName, ipAddress, browserInfo) |
Register a new user session |
UserDisconnected(circuitId) |
Mark a session as disconnected |
UserReconnected(circuitId) |
Restore a disconnected session |
UpdateActivity(circuitId) |
Update the last activity timestamp |
UpdateCurrentPage(circuitId, pagePath) |
Track a page navigation |
RecordActionExecuted(circuitId, actionId, actionCaption, viewId, objectId) |
Log an action execution |
GetActiveSessions() |
Get all active sessions |
GetSession(circuitId) |
Get a single session by circuit ID |
GetSessionByUserName(userName) |
Get a session by username |
GetGlobalActionHistory() |
Get the global recent action history |
RequestTermination(circuitId, reason) |
Request a session to terminate |
SubscribeToChanges(circuitId, callback) |
Subscribe to session change notifications |
UnsubscribeFromChanges(circuitId, callback) |
Unsubscribe from notifications |
ActiveUserService.UserConnected() registers the session with username, IP, and browser infoMonitoredCircuitHandlerProxy intercepts Blazor circuit lifecycle events (open, close, reconnect) and updates the serviceNavigationTracker monitors page changes and records them per userActiveUsersActionTrackingController attaches to all controllers and records action executionBlazorApplication.InvokeAsyncThe Monitoring module provides real-time user session monitoring for XAF Blazor applications. Administrators can view active users, track session status, monitor activity, and access server diagnostics — all from a built-in Active Users view under the Administration navigation group.

This module is not designed to work with the DevExpress Multitenant module
Install-Package 'Llamachant.ExpressApp.Monitoring.Blazor'
Startup.cs
services.AddXaf(Configuration, builder => {
builder.UseApplication<ExpressAppBlazorApplication>();
builder.Modules.AddLlamachantFrameworkMonitoringBlazorModule();
});
Pass an options delegate to customize behavior:
builder.Modules.AddLlamachantFrameworkMonitoringBlazorModule(options => {
options.ShowSessionInfo = true;
options.ShowConnectionInfo = true;
options.ShowActivityInfo = true;
options.ShowServerInfo = true;
options.MaxActivityCount = 20;
options.MaxGlobalActivityCount = 100;
options.AllowTerminatingSessions = true;
options.AllowViewingRecentActions = true;
});
| Property | Default | Description |
|---|---|---|
ShowSessionInfo |
true |
Show session status, login time, duration, and idle time |
ShowConnectionInfo |
true |
Show IP address, browser info, connection count, and heartbeat |
ShowActivityInfo |
true |
Show current page, page views, action count, and activity timeline |
ShowServerInfo |
true |
Show server memory usage, GC memory, active session count, and uptime |
MaxActivityCount |
20 |
Maximum number of activity timeline entries per user session |
MaxGlobalActivityCount |
100 |
Maximum number of entries in the global recent action history |
AllowTerminatingSessions |
true |
Allow administrators to force-terminate user sessions |
AllowViewingRecentActions |
true |
Allow viewing the recent actions popup |
The module adds an Active Users ListView under the Administration navigation group. The view displays all connected user sessions and updates in real-time.
| Status | Description |
|---|---|
| Active | User is currently interacting with the application |
| Idle | User is connected but has been inactive for more than 5 minutes |
| Disconnected | User's circuit connection has been lost |
Disconnected sessions are automatically removed after 1 minute if the user does not reconnect. Stale disconnected sessions older than 5 minutes are cleaned up when the session list is retrieved.
The columns displayed depend on which option groups are enabled:
Always visible:
UserName — The logged-in user's nameSession Info (ShowSessionInfo):
Status — Active, Idle, or DisconnectedLoginTime — When the user logged inSessionDuration — How long the session has been activeIdleTime — How long since the user's last activityActivity Info (ShowActivityInfo):
CurrentPage — The page the user is currently viewingDouble-clicking a session opens a modal detail view with additional information based on enabled options:
Connection Info (ShowConnectionInfo):
IPAddress, BrowserInfo, ConnectionCount, LastHeartbeat, HeartbeatAgeActivity Info (ShowActivityInfo):
CurrentPage, PageViewCount, ActionCount, LastActivityTime, ActivityTimelineServer Diagnostics (ShowServerInfo):
ServerMemoryUsed, ServerGCMemory, TotalActiveSessions, ServerUptimeForcefully logs out the selected user. The user's circuit receives a termination callback and the session is ended immediately. Requires AllowTerminatingSessions = true and an authenticated user.
Opens a popup showing the most recent actions executed across all users. Useful for auditing user activity in real-time. Requires AllowViewingRecentActions = true.
The module registers the following services automatically:
| Service | Lifetime | Description |
|---|---|---|
ActiveUserService |
Singleton | Core service tracking all sessions, activity, and action history |
ActiveUserServiceOptions |
Singleton | Configuration options |
ConnectionInfoHolder |
Scoped | Captures IP address, browser info, and circuit ID per connection |
NavigationTracker |
Scoped | Tracks page navigation events per circuit |
MonitoredCircuitHandlerProxy |
Scoped | Intercepts Blazor circuit lifecycle events |
Note: The module replaces any previously registered
CircuitHandlerservices withMonitoredCircuitHandlerProxy, which delegates to the DevExpressIScopedCircuitHandlerinternally.
The ActiveUserService singleton can be resolved from DI for programmatic access:
| Method | Description |
|---|---|
UserConnected(circuitId, userName, ipAddress, browserInfo) |
Register a new user session |
UserDisconnected(circuitId) |
Mark a session as disconnected |
UserReconnected(circuitId) |
Restore a disconnected session |
UpdateActivity(circuitId) |
Update the last activity timestamp |
UpdateCurrentPage(circuitId, pagePath) |
Track a page navigation |
RecordActionExecuted(circuitId, actionId, actionCaption, viewId, objectId) |
Log an action execution |
GetActiveSessions() |
Get all active sessions |
GetSession(circuitId) |
Get a single session by circuit ID |
GetSessionByUserName(userName) |
Get a session by username |
GetGlobalActionHistory() |
Get the global recent action history |
RequestTermination(circuitId, reason) |
Request a session to terminate |
SubscribeToChanges(circuitId, callback) |
Subscribe to session change notifications |
UnsubscribeFromChanges(circuitId, callback) |
Unsubscribe from notifications |
ActiveUserService.UserConnected() registers the session with username, IP, and browser infoMonitoredCircuitHandlerProxy intercepts Blazor circuit lifecycle events (open, close, reconnect) and updates the serviceNavigationTracker monitors page changes and records them per userActiveUsersActionTrackingController attaches to all controllers and records action executionBlazorApplication.InvokeAsync