Переменная сеанса ASP.NET неверна после быстрого события нескольких нажатий - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть сайт asp.net для управления проектами. Я понял, что когда я нажимаю на следующий проект очень быстро и часто он перекрывает все последующие проекты данными первого. Я вызываю метод для сохранения, прежде чем перейти к следующему проекту. Я также использую переменную сеанса для идентификатора проекта.

EDIT:

Похоже, сервер складывает метод сохранения и идентификаторы, но сохраняет значения первого проекта в элементах управления

Я прав?

это ajax, который вызывает метод сервера для получения идентификатора и установки его в скрытом поле:

function NextClick() {
            var tabvalue = $("#<%=TabsToFocus.ClientId%>").val();
            $.ajax(
                {
                    type: "POST",
                    url: "Projet.aspx/NextProj",
                    data: "{tab:'" + tabvalue + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(d) {
                        if (d.d != "False") {
                            $("#<%=hid_selProjetID.ClientID%>").val(d.d);
                            var btn = $("#<%=btnClickLstProjet.ClientID%>");
                            fillHidden();
                             btn.click();
                        }
                    }
                });
            }

И btn.click () вызывает этот метод на стороне сервера для сохранения

Private Sub Button1_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClickLstProjet.ServerClick

    If HttpContext.Current.Session.Item("isUser") IsNot Nothing AndAlso HttpContext.Current.Session.Item("isUser") = True Then
        If HttpContext.Current.Session.Item("curProjetID") IsNot Nothing Then

            btnSaveIndicateurs_Click()
            btnSaveEnTete_Click()
            btnSaveGen_Click()
            btnSavePlanif_Click()
        End If
    End If

    HttpContext.Current.Session.Item("curProjetID") = hid_selProjetID.Value
    Response.Redirect("Projet.aspx")

End Sub

Спасибо

1 Ответ

1 голос
/ 01 марта 2012

Самое первое, что вы должны сделать, это ОСТАНОВИТЬ использование сеанса .

Серьезно, отойти от объекта сеанса.

Надлежащее использование сеанса является долгосрочнымдовольно неизменные данные.Данные, которые должны изменяться буквально в каждом посте и т. Д., Принадлежат самой странице.


Вот что происходит.

  1. Вы нажимаете на ссылку, чтобы загрузитьдо проекта.Переменная Session устанавливается с текущим идентификатором проекта.

  2. Затем вы нажимаете на ссылку, чтобы получить следующий проект,

  3. Затем быстро нажимаете нассылка, чтобы получить тот после этого.

Сервер, тем временем, является многопоточным.# 3 в основном прервал исполнение # 2 .. и побежал до # 2.Это означает, что ваша переменная сеанса подключена.

Почему третий запрос выполняется перед вторым?Ну, вы выполняете ряд запросов.Вероятно, что запросы для запроса 2 выполняются немного дольше, чем запросы для запроса 3.

Решение: прекратить использование сеанса.

Почему: вы не можете предсказать порядок, в котором IIS будет отвечать на запросы.IIS - это параллельный (не последовательный) механизм, и запросы вполне могут происходить в той последовательности, в которой, как вы думаете, они должны.

Наконец, парень, который сказал, что сеанс заблокирован первым запросчиком, не совсем точен.Он ЗАПИСАН заблокирован ... но это происходит только тогда, когда страница начинает запись в сеанс.Чтения не блокируются.

Таким образом, когда запрос 3 выполняется, он использует идентификатор запроса 1 или 2. В зависимости от того, какой из них еще активен к тому времени, когда он достигает кода записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...