Если вы хотите защититься от этого, вам нужно, чтобы сервер знал, что текущий пользователь уже начал действие, и не может начать его снова, пока не будет выполнено условие.
Вы должны быть в состоянии идентифицировать этого пользователя среди множества, которые потенциально посещают ваш сайт.Проще всего это сделать с помощью SessionState, но если у вас больше нет необходимости в SessionState и вы хотите масштабировать ваше приложение, простой случайный файл cookie для идентификации пользователя можно использовать в качестве префикса для любых ключей, которые вы используете для помещения элементов вкеш сервера.
Допустим, вы использовали SessionState.Вы бы сделали что-то вроде следующего (псевдо):
public void StartAction()
{
var inProgress = HttpContext.Current.Session["actionInProgress"] as bool;
if (!inProgress)
{
try
{
HttpContext.Current.Session["actionInProgress"] = true;
MySqlController.DoWork();
}
finally
{
HttpContext.Current.Session["actionInProgress"] = false;
}
}
}
Выше не учитывается следующее:
- Перехват исключений и / или закрытие любых соединений в вашем
finally
block - Очередь последующих действий в результате следующих кликов на вашем клиенте (этот псевдокод просто возвращается, если действие уже выполняется)
- Я пошел засамое простое решение, но на самом деле лучшей практикой было бы включить его в качестве службы, которая работает асинхронно, чтобы вы могли отслеживать прогресс как в интересах пользователя, так и для предотвращения множественных параллельных процессов.