【问题标题】:ASP.NET - Accessing web page twice from clientASP.NET - 从客户端访问网页两次
【发布时间】: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,我试图了解如果用户两次提交页面(会话变量的值不同),会话变量会发生什么。似乎执行了第一个请求,然后执行了第二个请求。这是正确的吗?
  • 会话变量存储值,因此即使在回发之后仍然可以访问它们。如果用户使用两个不同的值执行两次,最后一个总是获胜。

标签: asp.net vb.net


【解决方案1】:

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

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

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

也请看-

ASP.NET Application and Page Life Cycle

ASP.NET Application Life Cycle Overview

【讨论】:

  • 谢谢。会话状态是否会在请求之间隔离?
  • 不,会话状态在页面之间共享。在页面生命周期的 AcquireRequestState 事件中检索会话变量。在每个页面获取会话变量后(每个页面请求一次),页面使用它自己的直到下一个页面请求。
  • 你能回答我的最后一个问题吗?如果用户访问页面 1 然后再次访问页面(在加载第一页之前)会发生什么情况。是否有可能在请求之间共享会话状态?
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2016-04-25
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多