Mediarq.Idempotency
1.5.1
dotnet add package Mediarq.Idempotency --version 1.5.1
NuGet\Install-Package Mediarq.Idempotency -Version 1.5.1
<PackageReference Include="Mediarq.Idempotency" Version="1.5.1" />
<PackageVersion Include="Mediarq.Idempotency" Version="1.5.1" />
<PackageReference Include="Mediarq.Idempotency" />
paket add Mediarq.Idempotency --version 1.5.1
#r "nuget: Mediarq.Idempotency, 1.5.1"
#:package Mediarq.Idempotency@1.5.1
#addin nuget:?package=Mediarq.Idempotency&version=1.5.1
#tool nuget:?package=Mediarq.Idempotency&version=1.5.1
Mediarq.Idempotency
Run a request at most once per key. A repeated request that implements IIdempotentRequest with the
same key replays the stored result instead of re-executing the handler — so a retried POST won't double
its effect.
dotnet add package Mediarq.Idempotency
Usage
builder.Services.AddDistributedMemoryCache(); // REQUIRED: an IDistributedCache (use Redis in production)
builder.Services.AddMediarqIdempotency();
public record ConfirmOrder(Guid OrderId, string IdempotencyKey) : ICommand<Result>, IIdempotentRequest
{
public TimeSpan? IdempotencyDuration => TimeSpan.FromMinutes(10);
}
// e.g. read the key from an Idempotency-Key header
var key = http.Headers["Idempotency-Key"].FirstOrDefault() ?? Guid.NewGuid().ToString();
await sender.Send(new ConfirmOrder(id, key));
Call after AddMediarq / AddMediarqCore. Use a stable, caller-supplied key. The stored result is
JSON-serialized; Result / Result<T> round-trip out of the box. For strict once-only semantics under
high concurrency, back it with a store that supports atomic set-if-absent (e.g. Redis).
Persistent stores
IdempotencyBehavior depends on the standard IDistributedCache — swap the backing store without any
code change:
- In-memory (single process, non-persistent):
AddDistributedMemoryCache()— shown above. - Redis:
AddStackExchangeRedisCache(o => o.Configuration = "..."). - Your own SQL database:
Mediarq.Idempotency.EntityFrameworkCore—AddMediarqIdempotencyEntityFrameworkCore<TContext>(), no Redis required.
Learn more
Wiring extensions · Full README
MIT © Nicolas Rouffart
| 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
- Mediarq.Caching (>= 1.5.1)
-
net8.0
- Mediarq.Caching (>= 1.5.1)
-
net9.0
- Mediarq.Caching (>= 1.5.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.