ASP.NET - 从客户端访问两次网页

时间:2012-10-19 18:16:49

标签: asp.net vb.net

如果一个用户在第一个页面返回到客户端之前尝试访问两次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应用程序中有这个错误。

2 个答案:

答案 0 :(得分:0)

enter image description here

您的问题与多线程无关;它是关于SessionState的。

ASP.NET运行时使用 lock to avoid overriding same session variables ,但它可以处理多个请求。

这就是为什么你看不到错过匹配的结果。

请同时查看 -

ASP.NET Application and Page Life Cycle

ASP.NET Application Life Cycle Overview

答案 1 :(得分:0)

重要的是要了解会话信息存储在应用程序级别,并且与页面没有直接关系。

您可以将它与类中的全局变量进行比较。如果您的所有方法都在读取和写入此变量,则它将始终包含上次更新时的信息。无论多少次,或哪种方法更新它都无关紧要。

要在代码中查看此内容,请使用一个属性创建一个新类。将会话变量更改为此类的对象。修改会话逻辑以引用此对象而不是字符串,并更新属性。

最后,在你的财产的设定者处设置一个断点。

这样可以让您在更新会话变量时看到什么值。您还可以查看堆栈跟踪以查看设置它的位置。

- 注意,这是假设您没有将农场引入此并从不同的机器访问会话 -