Помимо замечаний, высказанных @Mike о IRequiresSessionState
, заставляющем каждого «пользователя» (сеанс) обрабатывать только один запрос за раз, есть и другая причина, почему это нужно.
Предположим, у вас есть служба ajax (реализованная с помощью Generic Handler - * .ashx), которая выполняет «обновление» для конкретного пользователя на основе опубликованных данных. Допустим, обновление является тяжелым (около 250 мс) и включает в себя процесс «чтения / слияния / записи» в базу данных (снова данные изолируются для отдельного пользователя). Однако клиент (приложение, веб-сайт и т. Д.) Может выполнять несколько вызовов в быстрой последовательности, которые сервер не может контролировать.
Путем реализации IRequiresSessionState
(просто включив его в качестве интерфейса в ваш универсальный обработчик) ASP.NET обеспечит последовательную обработку для данного пользователя / сеанса запросов. Однако несколько пользователей могут параллельно выполнять вызовы для обновления. Это может позволить нам избежать «проблемы с потерянным обновлением», поскольку 2-й запрос не будет извлекать копию данных, пока 1-й запрос не завершит ее обновление.
public class SaveDataHandler : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
// Read request parameters
// Read database (user specific data)
// Process
// Write back to database (user specific data)
}
public bool IsReusable => false;
}