Предположим, пользователь делает несколько запросов одновременно, нужно ли мне блокировать весь код, который работает с сеансом?
Если, например, у меня есть следующий сценарий, где на одной вкладке своего браузера пользователь открывает страницу, а во второй он выходит из системы.
Запрос 1:
if(Session["user"] != null)
lblName.Text = Session["user"].Name;
Запрос 2:
if(logout)
Session["user"] = null;
Возможно ли, что Запрос 1 выдает исключение NullPointerException при доступе к свойству Name? Нужно ли мне заблокировать код в запросе 1, чтобы убедиться, что пользователь все еще существует после проверки на null? Или ASP.NET как-то справляется с этим автоматически?
Как всегда, ответ зависит от того, что вы подразумеваете под «безопасностью». В ASP .NET каждый запрос получает эксклюзивный доступ к своему состоянию сеанса. Это означает, что вам не нужно беспокоиться о синхронизации доступа в рамках одного запроса. Если Session ["user"] не равен NULL, то он будет иметь значение NULL для всей продолжительности текущего запроса. В вашем примере запрос 1 никогда не сгенерирует исключение нулевой ссылки.
В ASP.NET модуль сеанса использует пару блокировок чтения / записи на сеанс , поэтому запрос 1 будет иметь согласованные чтения, а запрос 2 будет блокироваться до завершения запроса 1.