Tiaga.ConcurrentRequestFilter.AspNetCore
1.0.0
dotnet add package Tiaga.ConcurrentRequestFilter.AspNetCore --version 1.0.0
NuGet\Install-Package Tiaga.ConcurrentRequestFilter.AspNetCore -Version 1.0.0
<PackageReference Include="Tiaga.ConcurrentRequestFilter.AspNetCore" Version="1.0.0" />
<PackageVersion Include="Tiaga.ConcurrentRequestFilter.AspNetCore" Version="1.0.0" />
<PackageReference Include="Tiaga.ConcurrentRequestFilter.AspNetCore" />
paket add Tiaga.ConcurrentRequestFilter.AspNetCore --version 1.0.0
#r "nuget: Tiaga.ConcurrentRequestFilter.AspNetCore, 1.0.0"
#:package Tiaga.ConcurrentRequestFilter.AspNetCore@1.0.0
#addin nuget:?package=Tiaga.ConcurrentRequestFilter.AspNetCore&version=1.0.0
#tool nuget:?package=Tiaga.ConcurrentRequestFilter.AspNetCore&version=1.0.0
Tiaga.ConcurrentRequestFilter.AspNetCore
A lightweight ASP.NET Core middleware that prevents concurrent mutable HTTP requests from the same user. When a user sends a mutable request (POST, PUT, PATCH, DELETE) while one is already in progress, the middleware returns 409 Conflict instead of processing it.
Motivation
Adding try-catch to every database call to handle errors from duplicate submissions (double-clicks, rapid retries, etc.) gets tedious. This middleware blocks the second request from the same user at the HTTP layer before it reaches the database, so those try-catch blocks are not needed.
Installation
dotnet add package Tiaga.ConcurrentRequestFilter.AspNetCore
Usage
Place app.UseConcurrentRequestFilter after app.UseAuthentication() and app.UseAuthorization() so the user identity is available.
Using a JWT sub claim (most common)
app.UseConcurrentRequestFilter(ctx => ctx.User.FindFirst("sub")?.Value);
Using a custom claim
app.UseConcurrentRequestFilter(ctx => ctx.User.FindFirst("userId")?.Value);
Using a custom entity/model value
app.UseConcurrentRequestFilter(ctx =>
{
var userService = ctx.RequestServices.GetRequiredService();
return userService.GetCurrentUserId(ctx)?.ToString();
});
With IP fallback for unauthenticated endpoints
app.UseConcurrentRequestFilter(ctx =>
ctx.User.FindFirst("sub")?.Value
?? ctx.Connection.RemoteIpAddress?.ToString());
Configuration
By default the middleware guards POST, PUT, PATCH, and DELETE. You can override this:
app.UseConcurrentRequestFilter(
ctx => ctx.User.FindFirst("sub")?.Value,
options =>
{
options.MutableMethods = [HttpMethods.Post, HttpMethods.Delete];
});
The identity provider lambda can return any string like claim values, email, integer IDs and IP. If it returns null, the lock is skipped and the request passes through, which is useful for unauthenticated endpoints like registration.
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. 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
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
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 |
|---|---|---|
| 1.0.0 | 94 | 5/21/2026 |