@MADm

Нарушение порядка запросов страницы, баг браузера или сервера?

работаю с web forms asp.net. Делаю страничку с капчей. Картинка капчи генерируется в page_load страницы, пишется в сессию и отдается в ответ на запрос этой страницы. В некоторых случаях( к примеру спам в браузере ф5) в сессии и у пользователя разные данные. Для теста сделал страничку в которой указал public int a; в page_load указал
if (Session["a"] == null)
                Session["a"] = a;
            else { 
                Session["a"] = (int)Session["a"] + 1;
                a = (int)Session["a"];
            }


в странице вывел параметр пользователю <%=a %>
те при каждом ф5 пользователь должен видеть параметр на 1 больше. но если мы зажмем ф5 то у пользователя будет 7 а в сессии 9. Если я правильно понимаю браузер отбрасывает 2 последних запроса потому что запрос номер 7 уже загружен и его данные для отправки идентичны 8 и 9 запросу. Но сервер их всё равно обрабатывает. Это так или всё совсем по другому?
  • Вопрос задан
  • 2284 просмотра
Пригласить эксперта
Ответы на вопрос 2
Liatano
@Liatano
Может все действительно так. Можно в качестве проверки(или костыля) повесить аякс-запрос для окончательного уточнения сессии.
Ответ написан
Комментировать
SergeyRodyushkin
@SergeyRodyushkin
.NET Developer
А на мой взгляд, тут банальное race condition. Когда мы зажимаем F5, несколько запросов теоретически могут одновременно попасть в конвейер обработки.
Попробуйте поместить указанные операции в критическую секцию:
lock (Session.SyncRoot) {
    if (Session["a"] == null)
        Session["a"] = a;
    else { 
        Session["a"] = (int)Session["a"] + 1;
        a = (int)Session["a"];
    }
}


И я бы сделал так, а то у вас три операции чтения, хотя нужна только одна:
var storedValue = Session["a"];
a = (storedValue == null) ? a : (int)storedValue + 1;
Session["a"] = a;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы