【发布时间】:2012-10-19 18:16:48
【问题描述】:
如果一个用户在第一个页面返回给客户端之前尝试访问 ASP.NET 页面两次会发生什么?看看下面的代码:
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Session("ID") = 1
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Response.Redirect("Default3.aspx")
End Sub End Class
Partial Class Default2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Session("ID") = 2
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Response.Redirect("Default3.aspx")
End Sub
End Class
Imports System.Threading
Partial Class Default3
Inherits System.Web.UI.Page
Dim intTest As Integer = 0
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
For intTest = 0 To 10
Response.Write(Session("ID") & " " & intTest & "<br>")
Thread.Sleep(1000)
Next
End Sub
End Class
同时从 default.aspx(通过单击按钮)和 default2.aspx(通过单击按钮)从同一客户端 (PC) 访问 default3.axpx 会导致会话变量在两个请求上相同(尽管我设置了变量第一个请求为 1,第二个请求为 2)。是否可以在没有线程的情况下复制这种行为?我相信我在不使用线程的 asp.net 应用程序中存在此错误。
【问题讨论】:
-
您以两种形式访问同一个会话变量。这就是为什么根据您最后加载的页面而被覆盖的原因。您可以将数组添加到会话中。
-
@UNeverNo,可以在单线程 asp.net 应用程序中模拟这种行为吗?即通过删除 default3.aspx 中的 thread.sleep?
-
我现在不知道你想要什么。你想测试什么?您想知道如果用户从浏览器中的两个不同选项卡提交同一个页面会发生什么?
-
@UNeverNo,我试图了解如果用户两次提交页面(会话变量的值不同),会话变量会发生什么。似乎执行了第一个请求,然后执行了第二个请求。这是正确的吗?
-
会话变量存储值,因此即使在回发之后仍然可以访问它们。如果用户使用两个不同的值执行两次,最后一个总是获胜。