3

如果一个用户在第一个页面返回给客户端之前尝试访问 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 on第一个请求和第二个请求 2)。是否可以在没有线程的情况下复制这种行为?我相信我在不使用线程的 asp.net 应用程序中有这个错误。

4

2 回答 2

0

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

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

为了帮助您在代码中看到这一点,请创建一个具有一个属性的新类。将您的会话变量更改为此类的对象。修改会话逻辑以引用此对象而不是字符串,并更新属性。

最后,在属性的设置器上设置一个断点。

这将让您查看会话变量何时更新,以及更新的值。您还可以查看堆栈跟踪以查看设置它的内容。

-注意,这一切都假设您没有将农场引入其中并且正在从不同的机器访问会话--

于 2012-10-19T20:45:34.177 回答
0

在此处输入图像描述

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

ASP.NET 运行时使用锁来避免覆盖相同的会话变量,尽管它可以处理多个请求。

这就是为什么您看不到不匹配结果的原因。

还请看——

ASP.NET 应用程序和页面生命周期

ASP.NET 应用程序生命周期概述

于 2012-10-19T20:07:30.640 回答