Repository navigation
Architecture
github-actions[bot] edited this page Oct 4, 2026
·
2 revisions
flowchart LR
subgraph app["Your ASP.NET Core app"]
wc["Workflow Core host"]
relay["LifeCycleRelay"]
writer["JournalWriter"]
journal[("IDashboardJournal<br/>in-memory or EF Core")]
store[("Workflow Core<br/>persistence")]
api["Dashboard API"]
designer["Designer API<br/>(optional)"]
hub["DashboardHub<br/>(SignalR)"]
ui["Embedded Angular UI"]
wc -- "lifecycle events,<br/>step errors" --> relay
relay --> hub
relay --> writer --> journal
api --> store
api --> journal
api -- "start, suspend,<br/>publish event" --> wc
designer -- "IDefinitionLoader" --> wc
designer --> journal
end
browser["Browser"] -- "REST" --> api
browser -- "REST" --> designer
hub -- "activity" --> browser
ui -- "static files" --> browser
| Package | Contents | Depends on |
|---|---|---|
WorkflowCore.Dashboard |
API, SignalR hub, relay, in-memory journal, embedded UI | WorkflowCore, ASP.NET Core |
WorkflowCore.Dashboard.EntityFramework |
EF Core journal | the above, EF Core Relational 8+ |
WorkflowCore.Dashboard.Designer |
Designer API, step catalog, validation, sync | the above, WorkflowCore.DSL |
WorkflowCore.Dashboard.OpenIdConnect |
Sign-in: cookie and OpenID Connect schemes, provider presets, role mapping, sign-out pages | the above, ASP.NET Core OpenID Connect (one build per .NET version) |
Optional packages plug in through DashboardBuilder (UseJournal, Services) and IDashboardExtension (extra endpoints under /api or the dashboard root, and a feature flag for the UI).
MapWorkflowCoreDashboard creates one route group:
-
Authorization policy (whole group, when
AuthorizationPolicyis set): ASP.NET Core sign-in; signed-out browsers are sent to the identity provider, API calls get 401. -
Authorization filter (whole group): sets security headers and applies
DashboardOptions.Authorization. Signed-in users without access get an explanatory page. Endpoints markedAllowAnonymous(sign-out pages) skip it. -
Change filter (
/api): POST, PUT and DELETE need theX-Wfc-Dashboardheader, noSec-Fetch-Site: cross-site,AllowActions, andActionAuthorization. -
Endpoints: dashboard API, extension endpoints, the hub, and the UI with fallback to
index.html, whose<base href>is rewritten to the mount path.
- Workflow Core raises a lifecycle event;
LifeCycleRelaysubscribes throughIWorkflowHost.OnLifeCycleEventandOnStepError. - The relay builds an
ActivityEntrywith a deterministic ID, joins error events with their exception, and resolves step names from the registry. - The entry goes to all hub clients at once, and to
JournalWriter, which batches writes off the workflow path. - The journal stores the entry once and updates the instance index (
InstanceIndexReducerturns events into status changes, tolerating out-of-order arrival).
Angular 22 with Angular Material, standalone components and signals. npm run build writes into src/WorkflowCore.Dashboard/wwwroot, which is embedded in the assembly and served by EmbeddedUi with long-lived caching for hashed files. Flowcharts are SVG laid out with dagre; the designer canvas is SVG as well.
Start
Guides
Reference