IdempotencyGuard.SqlServer
1.3.0
dotnet add package IdempotencyGuard.SqlServer --version 1.3.0
NuGet\Install-Package IdempotencyGuard.SqlServer -Version 1.3.0
<PackageReference Include="IdempotencyGuard.SqlServer" Version="1.3.0" />
<PackageVersion Include="IdempotencyGuard.SqlServer" Version="1.3.0" />
<PackageReference Include="IdempotencyGuard.SqlServer" />
paket add IdempotencyGuard.SqlServer --version 1.3.0
#r "nuget: IdempotencyGuard.SqlServer, 1.3.0"
#:package IdempotencyGuard.SqlServer@1.3.0
#addin nuget:?package=IdempotencyGuard.SqlServer&version=1.3.0
#tool nuget:?package=IdempotencyGuard.SqlServer&version=1.3.0
IdempotencyGuard.SqlServer
SQL Server-backed idempotency store for the IdempotencyGuard library. Uses MERGE with HOLDLOCK for atomic claim operations and supports automatic schema provisioning.
Installation
dotnet add package IdempotencyGuard.AspNetCore
dotnet add package IdempotencyGuard.SqlServer
Setup
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddIdempotencyGuard(options =>
{
options.MissingKeyPolicy = MissingKeyPolicy.Reject;
});
builder.Services.AddIdempotencyGuardSqlServerStore(options =>
{
options.ConnectionString = "Server=localhost;Database=myapp;Trusted_Connection=true";
options.TableName = "IdempotencyEntries"; // default
options.AutoCreateTable = true; // creates table on first use
});
var app = builder.Build();
app.UseIdempotencyGuard();
How it works
- Claim —
MERGEwithHOLDLOCKfor atomic upsert with fingerprint validation - Complete —
UPDATEto store the response body, headers, and status code - Release —
DELETEto remove the claim after processing failure - Cleanup — Batched
DELETE TOPoperations via the background cleanup service
Schema
When AutoCreateTable = true, the store creates the following table on first use:
CREATE TABLE [IdempotencyEntries] (
[Key] NVARCHAR(256) NOT NULL PRIMARY KEY,
RequestFingerprint NVARCHAR(128) NOT NULL,
State NVARCHAR(20) NOT NULL,
ClaimedAtUtc DATETIME2 NOT NULL,
CompletedAtUtc DATETIME2 NULL,
ExpiresAtUtc DATETIME2 NOT NULL,
StatusCode INT NULL,
HeadersJson NVARCHAR(MAX) NULL,
ResponseBody VARBINARY(MAX) NULL
);
Expired entry cleanup
Expired entries are purged by the built-in background service. Configure the cleanup interval and batch size:
builder.Services.AddIdempotencyGuard(options =>
{
options.Cleanup.Interval = TimeSpan.FromMinutes(5);
options.Cleanup.BatchSize = 1_000;
});
Documentation
See the full documentation on GitHub for middleware configuration, selective fingerprinting, and production deployment guides.
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. 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
- IdempotencyGuard (>= 1.3.0)
- Microsoft.Data.SqlClient (>= 5.2.2)
- Microsoft.Extensions.Options (>= 8.0.2)
-
net8.0
- IdempotencyGuard (>= 1.3.0)
- Microsoft.Data.SqlClient (>= 5.2.2)
- Microsoft.Extensions.Options (>= 8.0.2)
-
net9.0
- IdempotencyGuard (>= 1.3.0)
- Microsoft.Data.SqlClient (>= 5.2.2)
- Microsoft.Extensions.Options (>= 8.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.