Excalibur.Workflows.SqlServer
10.0.0-alpha.8
dotnet add package Excalibur.Workflows.SqlServer --version 10.0.0-alpha.8
NuGet\Install-Package Excalibur.Workflows.SqlServer -Version 10.0.0-alpha.8
<PackageReference Include="Excalibur.Workflows.SqlServer" Version="10.0.0-alpha.8" />
<PackageVersion Include="Excalibur.Workflows.SqlServer" Version="10.0.0-alpha.8" />
<PackageReference Include="Excalibur.Workflows.SqlServer" />
paket add Excalibur.Workflows.SqlServer --version 10.0.0-alpha.8
#r "nuget: Excalibur.Workflows.SqlServer, 10.0.0-alpha.8"
#:package Excalibur.Workflows.SqlServer@10.0.0-alpha.8
#addin nuget:?package=Excalibur.Workflows.SqlServer&version=10.0.0-alpha.8&prerelease
#tool nuget:?package=Excalibur.Workflows.SqlServer&version=10.0.0-alpha.8&prerelease
Excalibur.Workflows.SqlServer
SQL Server implementation of the durable workflow signal inbox for Excalibur.
Part Of
The Excalibur durable-execution engine (Excalibur.Workflows).
What It Provides
A restart-durable IWorkflowSignalInbox. Admitted signals and their deduplication keys are persisted to
SQL Server, so a signal admitted but not yet drained survives a process restart, and a producer's
redelivery of the same (instanceId, signalId) after a restart is still deduplicated — the guarantee the
in-process default cannot make.
Usage
services.AddWorkflows();
// Wire the durable SQL Server signal inbox (overrides the in-process default) and, in the same call,
// register the durability capability marker.
services.AddSqlServerWorkflowSignalInbox(options =>
{
options.ConnectionString = configuration.GetConnectionString("Workflows")!;
options.SchemaName = "dbo";
options.TableName = "workflow_signal_inbox";
});
// Optional: fail host start if a durable signal inbox is NOT wired (a deployment that requires
// restart-durable signals opts in to this guard).
services.RequireDurableSignalInbox();
Schema
The store never creates its table at runtime. Run the shipped, idempotent DDL script against the target database before the first signal is admitted:
Scripts/001_CreateWorkflowSignalInboxSchema.sql
It creates the table below (shown here for reference; the script is the source of truth and is safe to re-run):
CREATE TABLE [dbo].[workflow_signal_inbox] (
Sequence BIGINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
InstanceId NVARCHAR(200) NOT NULL,
SignalId NVARCHAR(200) NOT NULL,
SignalName NVARCHAR(200) NOT NULL,
PayloadJson NVARCHAR(MAX) NULL,
CONSTRAINT UQ_workflow_signal_inbox UNIQUE (InstanceId, SignalId)
);
The UNIQUE (InstanceId, SignalId) constraint is required for correctness, not just hygiene: it is what
makes a producer's redelivery of an already-admitted signal a no-op. Omit it and every redelivery is
admitted a second time, silently breaking exactly-once signal delivery. Sequence is an IDENTITY arrival
column: drain order is the monotonic append sequence, never a wall-clock timestamp, so consumption is
deterministic and reproducible.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AspNetCore.HealthChecks.SqlServer (>= 9.0.0)
- Ben.Demystifier (>= 0.4.1)
- BenchmarkDotNet (>= 0.15.8)
- CloudNative.CloudEvents (>= 2.8.0)
- CloudNative.CloudEvents.SystemTextJson (>= 2.8.0)
- Cronos (>= 0.12.0)
- Dapper (>= 2.1.72)
- Excalibur.Data.SqlServer (>= 10.0.0-alpha.8)
- Excalibur.Dispatch.Abstractions (>= 10.0.0-alpha.8)
- Excalibur.Workflows.Abstractions (>= 10.0.0-alpha.8)
- FluentValidation (>= 12.1.1)
- FluentValidation.DependencyInjectionExtensions (>= 12.1.1)
- IdentityModel (>= 7.0.0)
- JsonNet.ContractResolvers (>= 2.0.0)
- Medo.Uuid7 (>= 3.2.0)
- MemoryPack (>= 1.21.4)
- Microsoft.ApplicationInsights (>= 3.1.0)
- Microsoft.AspNetCore.Authorization (>= 10.0.7)
- Microsoft.CodeAnalysis.Analyzers (>= 5.3.0)
- Microsoft.CodeAnalysis.Common (>= 5.3.0)
- Microsoft.CodeAnalysis.CSharp (>= 5.3.0)
- Microsoft.Data.SqlClient (>= 7.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Caching.Memory (>= 10.0.10)
- Microsoft.Extensions.Configuration (>= 10.0.10)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.10)
- Microsoft.Extensions.Configuration.CommandLine (>= 10.0.10)
- Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0.10)
- Microsoft.Extensions.Configuration.Json (>= 10.0.10)
- Microsoft.Extensions.DependencyInjection (>= 10.0.10)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.10)
- Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Hosting (>= 10.0.10)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Http (>= 10.0.10)
- Microsoft.Extensions.Logging (>= 10.0.10)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Logging.Console (>= 10.0.10)
- Microsoft.Extensions.ObjectPool (>= 10.0.10)
- Microsoft.Extensions.Options (>= 10.0.10)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.10)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.10)
- Microsoft.IdentityModel.Tokens (>= 8.17.0)
- OpenTelemetry (>= 1.15.3)
- OpenTelemetry.Api (>= 1.15.3)
- OpenTelemetry.Extensions.Hosting (>= 1.15.3)
- Polly (>= 8.6.6)
- System.IdentityModel.Tokens.Jwt (>= 8.17.0)
- System.Threading.RateLimiting (>= 10.0.7)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.0-alpha.8 | 38 | 8/14/2026 |
| 10.0.0-alpha.7 | 41 | 8/13/2026 |
| 10.0.0-alpha.6 | 56 | 8/11/2026 |
| 10.0.0-alpha.5 | 42 | 8/10/2026 |
See CHANGELOG.md for release notes