【问题标题】:ASP.NET session variable is wrong after multiple click event fast快速多次单击事件后 ASP.NET 会话变量错误
【发布时间】:2025-12-17 14:00:02
【问题描述】:

我有一个 asp.net 网站来管理项目。我意识到,当我非常快地点击下一个项目时,它通常会用第一个项目的数据覆盖所有下一个项目。我在进行下一个项目之前调用了一个保存方法。我还使用会话变量作为项目的 ID。

编辑:

看起来服务器堆叠了保存方法和 id,但将第一个项目的值保留在控件中

我说的对吗?

这是调用服务器方法以获取 id 并将其设置在隐藏字段中的 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 秒 plz 它来了。我试图使它更具可读性和简单性。我的代码是法语
  • 在 asp.net 中,会话对象被使用它的请求“锁定”。如果第二个请求到达,而第一个请求仍在执行,则第二个请求将等待第一个请求完成,然后才能访问会话对象。也许会有所帮助。
  • 我不明白为什么它会覆盖我所有的项目
  • 您的NextProj 方法有什么作用? WebMethods 是静态的,这意味着由所有请求共享。我假设您必须查看那里才能找到问题的根源。 @Johnny5:这仅适用于来自同一用户的请求,由于用户多次单击该按钮,因此此处实际上适用。

标签: asp.net vb.net session


【解决方案1】:

您应该做的第一件事是停止使用会话

说真的,远离会话对象。

正确使用会话是长期的、相当不变的数据。必须在每个回帖等上更改的数据属于页面本身。


这就是正在发生的事情。

  1. 您单击链接以加载项目。会话变量正在使用当前项目 ID 进行设置。

  2. 然后你点击一个链接来获取下一个项目,

  3. 然后快速点击链接获取之后的那个。

同时,服务器是多线程的。 #3 基本上中断了 #2 的执行......并在 #2 之前运行。这意味着你的会话变量被抬高了。

为什么第三个请求会在第二个请求之前运行?好吧,您正在执行许多查询。执行请求 2 的查询可能比请求 3 的查询花费的时间稍长。

解决方案:停止使用 Session。

原因:您无法预测 IIS 响应请求的顺序。 IIS 是一个并行(不是串行)引擎,请求很可能会按照您认为的顺序发生。

最后,那个说会话被第一个请求者锁定的人并不完全准确。它是写锁定的..但这仅在页面开始写入会话时发生。读取未锁定。

因此,当请求 3 执行时,它使用的是请求 1 或 2 的 ID。这取决于在写入代码时哪个仍然处于活动状态。

【讨论】:

  • 谢谢!!现在我更了解它是如何工作的!我希望我可以停止使用会话,但我的老板不希望...所以我禁用控件以在加载时更改项目...