gpt4 book ai didi

asp.net - 在没有 session 的情况下访问 asp.net 中的公共(public)类变量

转载 作者:行者123 更新时间:2023-12-02 12:08:24 25 4
gpt4 key购买 nike

我正在使用我发现的这个示例来学习如何加载类文件并通过它们访问变量。这是在 App_Code 文件夹中名为 Class1.vb 的文件中(这不是应用程序项目):

Imports Microsoft.VisualBasic
Public Class my_class
Public Shared Sub my_sub()
Dim vartest As String
vartest = 10
HttpContext.Current.Session("myvar") = vartest
End Sub
End Class

这是 aspx 文件的代码隐藏:
    Imports my_class
Partial Public Class test
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
my_class.my_sub()
Label1.Text = HttpContext.Current.Session("myvar")
End Sub
End Class

我如何在不使用 session 的情况下访问 vartest 变量,因为如果多个函数同时访问该变量,我假设该变量可以被覆盖。是否可以采用另一种方式,将变量发送到类文件?

最佳答案

听起来您需要快速了解一些基本的 ASP.Net Webforms 概念。首先,我将反驳一个常见的新手误解:
您的 Page 类不会在 Web 服务器上停留很长时间
我认为许多新的 ASP.Net 开发人员都有这样的想法,即 Web 服务器为访问其站点的每个用户 session 保留其页面类的单个实例,并且每个回发或事件都使用相同的页面类实例。这不是它的工作原理。几乎总是创建 ASP.Net 页面类实例,并且 销毁在不到一秒的时间内再次出现,大多数有经验的开发人员认为,如果需要更长的时间,这是一个大问题。
ASP.NET 依赖于 HTTP 协议(protocol)
这里要记住的是 ASP.Net 仍然依赖于 HTTP 协议(protocol),而 http 归结为 请求 回复 .当您查看网页时,您的浏览器首先向服务器发送请求。服务器响应,通常使用 html 文档。然后浏览器将解析 html;根据它在 html 中看到的内容,浏览器可能会向服务器发送更多请求以获取更多资源,例如 javascript、图像或 css 文件。每个请求都会产生一个单独的响应,浏览器使用所有这些资源将页面呈现到屏幕上。然而,ASP.Net 运行时通常不需要处理额外的请求(这会使事情变慢)——只有初始的 html 需要 ASP.Net 支持;您希望其他资源是可以缓存的基本文件。
ASP.Net 运行时为每个请求创建一个新的类实例。
当 ASP.net 运行时处理对页面的请求时,它将创建页面类的新实例。运行时将遵循 ASP.Net Page lifecycle (这应该真正命名为“ASP.Net 页面请求生命周期”),并按照生命周期定义的特定顺序调用此类实例中的某些方法或引发某些事件。
这意味着每个回发或事件都在类的不同实例中运行。
这也意味着每个回发或事件都在重建和传输全部 的 html 进入您的页面,而不仅仅是您想要更改的部分。对于您的服务器代码,结果是类级变量在 ASP.Net 中真正有用的唯一事情就是将在单个 http 请求中使用的事情。对于浏览器,结果是每次事件后你都在使用全新的 DOM .
要理解所有这些,重要的是还要很好地理解类和类的实例之间的区别。您问题中的几个项目让我不确定您是否有这种理解。
ASP.Net 运行时在您站点的所有用户之间共享一个应用程序实例
对于整个网站及其所有用户,Web 服务器通常只有一个应用程序实例。因此,任何具有共享/静态范围的东西对每个用户都是通用的。在 ASP.Net 中很少适合共享/静态的任何内容。
那么,您如何处理应该与单个用户一起使用或访问您的网站的数据?
这是正是 什么Session是为了。在任何给定时间, session 对于单个请求始终是唯一的。您担心多个函数同时访问 session ,但这不会发生。 ASP.Net 页面生命周期确保除非您手动生成额外的线程,否则对于给定的 HttpContext 和 Session,一次只运行一个函数。如果用户以某种方式同时发送了两个应该具有相同 Session/HttpContext 的请求,则一个将由 ASP.Net 运行时保留,直到另一个完成。如果您不想一直引用 session ,则可以在类中构建包装 session 变量的属性。见 @Pankaj's answer例如。

关于asp.net - 在没有 session 的情况下访问 asp.net 中的公共(public)类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com