Как не дублировать отправку письма при одновременных http запросах
Сейчас есть текущая реализация такая: приходят N HTTP запросов, прямо друг за другом (конкретно не больше 5). В обработчике HTTP запроса отправляется email. Соответственно сейчас email отправляется N раз — по количеству запросов.
Необходимо исправить — чтобы email отправлялся только 1 раз — не смотря на N запросов Привожу тестовую реализацию (реальный код не могу прислать). При первом запросе статический флаг устанавливается в true – таким же он останется и при последующих запросах. Тут же запускается таймер. Через безопасный интервал флаг сбрасывается. Интервал — это примерное время, через которое пользователь опять инициирует действия, вызвавшее отправку email
Я бы хотел избавиться от таймера и флага — нужно как-то отслеживать сколько запросов и каких пришло. Как это сделать и можно ли?
Ещё вариант который вижу — хранить в БД признак, но не хотелось бы этого делать.
public class HomeService
{
private static bool _isMessageSent = false;
private Timer aTimer;
public void SetIsMessageSent()
{
SetTimer();
_isMessageSent = true;
}
private static void ResetIsMessageSent()
{
_isMessageSent = false;
}
private void SetTimer()
{
aTimer = new Timer(20000);
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = false;
aTimer.Enabled = true;
}
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
ResetIsMessageSent();
aTimer.Stop();
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime);
}
}
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly HomeService _homeService;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
_homeService = new HomeService();
}
public IActionResult Index()
{
_homeService.SetIsMessageSent();
return View();
}