/
ilyamikhaylov07
/
integration_solution_course
Обзор
Документация
Войти
/
ilyamikhaylov07
/
integration_solution_course
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
TaskAPI/Middleware/IdempontencyMiddleware.cs
56 строк
2 KB
Ilya
Init
24 сен 2025, 16:32
24 сен 2025, 16:32
360074e
Код
Авторство
О чём код?
using Microsoft.Extensions.Caching.Memory; namespace TaskAPI.Middleware { public class IdempotencyMiddleware { private readonly RequestDelegate _next; private readonly IMemoryCache _cache; public IdempotencyMiddleware(RequestDelegate next, IMemoryCache cache) { _next = next; _cache = cache; } /// <summary> /// Если от клиента приходит POST запрос с заголовком "Idempotency-Key", то применяется middleware /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task InvokeAsync(HttpContext context) { if (context.Request.Method != HttpMethods.Post || !context.Request.Headers.TryGetValue("Idempotency-Key", out var keyValue)) { await _next(context); return; } var key = keyValue.ToString(); if (_cache.TryGetValue(key, out string cachedResponse)) { context.Response.StatusCode = StatusCodes.Status200OK; context.Response.ContentType = "application/json"; await context.Response.WriteAsync(cachedResponse); return; } var originalBodyStream = context.Response.Body; using var responseBody = new MemoryStream(); context.Response.Body = responseBody; await _next(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var responseText = await new StreamReader(context.Response.Body).ReadToEndAsync(); context.Response.Body.Seek(0, SeekOrigin.Begin); _cache.Set(key, responseText, TimeSpan.FromHours(2)); await responseBody.CopyToAsync(originalBodyStream); } } }