【问题标题】:Loosing session variable data from one page to the other in VB.NET在 VB.NET 中从一页到另一页丢失会话变量数据
【发布时间】:2019-08-11 17:40:38
【问题描述】:

我对 VB.NET 有点陌生。我有一个设置 2 个会话变量并重定向到第二页的页面。第二页至少使用其中一个会话变量。我可以说,因为在第二页上,如果会话变量不正确,用户将被重定向到拒绝访问页面。第二页也使用了有问题的会话变量。它将根据变量的值读取它并填充网格视图。我像这样设置变量

Session("ID") = Convert.ToInt32(a_value) 

在第二页上我像这样检索变量

a_page_variable = Session("ID")

我觉得奇怪的是,当我在 Visual Studio 中运行此代码时,它按预期工作,但是当我部署并运行它时,我从会话变量中得到 0 而不是“a_value”的真实值。我尝试了一些方法,例如确保数据类型在页面之间匹配并尝试不同的方法来检索变量,例如

Session("userID")

CType(Session.Item("userID"), Int32)

我还尝试通过使用查看进入第二页的内容 Response.Write 我还尝试使用 SQL Profiler 查看正在执行什么样的调用来填充 gridview,但我没有任何运气。 gridview 给了我一个空数据集,Profiler 没有检测到应用程序的调用。我认为使用会话变量非常简单,但显然我遗漏了一些东西。

感谢您的帮助, 比利

【问题讨论】:

  • 在您部署的 web.config 中如何配置会话存储?部署环境是什么样的?例如是否可能不止一个 IIS 服务器(例如在集群中,每个请求都可能被负载平衡器重定向到不同的物理服务器 - 我问这个是因为在那种情况下服务器需要共享会话数据,可能存储在数据库中)?没有配置和代码信息,很难给出具体的建议。代码描述很有用,但实际上很难修复!
  • 我对 .NET 有点陌生,我不知道如何回答第一个问题。我怎样才能知道?就部署环境而言,只有一台IIS服务器
  • 通过查看您的 web.config 文件。 c-sharpcorner.com/UploadFile/484ad3/session-state-in-Asp-Net 可能会帮助您了解不同的会话存储选项以及在文件中查找的内容。
  • 谢谢。我会检查一下。
  • 好的,那么我们似乎可以排除这种情况。正如下面的答案所指出的,会话问题还有许多其他可能的原因。由于这似乎是一个环境问题(即它在本地环境中工作,但在服务器中不起作用),那么您的代码出错的可能性较小。由于我们对您的环境没有任何可见性,因此除了为可能的搜索区域提出建议之外,真的很难做任何事情。抱歉,除了下面的内容之外,我真的没有什么要补充的了。

标签: asp.net vb.net session


【解决方案1】:

一种可能性(也是唯一一种可以通过我们掌握的信息来猜测的可能性)可能是 response.redirect 导致应用程序因异常而终止。

重定向的时候,要一直传一个false,然后调用完成请求。

Response.Redirect(urlstring, False)
Response.CompleteRequest()

不遵循这些步骤可能会导致异常,这可能会导致会话中断。

此外,解析虚拟路径,因为某些浏览器(尤其是移动设备)可以将这些重定向完全视为新请求,从而生成新的会话令牌。

Dim urlstring As String
urlstring = Page.ResolveUrl("~/default.aspx")

也就是说,对于这种情况有很多possible causes

  1. 应用程序池重启
  2. 应用域重新启动
  3. 代码意外更改值
  4. AV 修改文件
  5. 部署到网络场

根据上面提供的描述,我们没有足够的信息来真正解决问题。

【讨论】:

  • 感谢斯蒂芬的意见。我已经尝试解析 url 并将 false 添加到重定向,但我仍然遇到同样的问题。我正在两个页面上的 Page_Load 事件中设置和检索会话变量。
  • 感谢斯蒂芬的意见。我已经尝试解析 url 并将 false 添加到重定向,但我仍然遇到同样的问题。我在两个页面的 Page_Load 事件中设置和检索会话变量。这是来自第一页Session("ID") = Convert.ToInt32(a_value) urlString = Page.ResolveUrl("~/User.aspx") Response.Redirect(urlString, False)。在第二页,我有这个a_page_variable = Session("ID") SqlSource.SelectParameters("ID").DefaultValue = a_page_variable
  • 斯蒂芬,我没有你列出的任何项目。有一个应用程序池,域尚未重新启动,应用程序尚未部署到 Web 场。我没有收到任何来自 AV 的消息。还有什么其他信息可以提供帮助吗?
  • 非常好的答案。我有一个类似的程序,但不一样。我的会话值在家里工作得很好......但是当我在办公室的 6 台计算机的 LAN 上使用它们时。前 6 个用户没有任何问题,会话工作正常......但是当他们更改为接下来的 6 个用户并登录他们的帐户时......会话变量变为空,但在登录后最终恢复正常 2-还有 4 次……还有我无法理解的奇怪错误……有什么想法吗?
【解决方案2】:

感谢 ADyson、Stephen Wrighton 和所有努力帮助我解决这个问题的人。通过添加写入服务器日志文件的代码,我能够找出发生了什么。找到日志代码here。我发现我从来没有接触过设置会话变量的代码,这就是它从未在第二页上填充的原因。我试图通过使用Environment.UserName 来获取用户的登录名,这将返回当前登录到操作系统的人的用户名。但我真正想做的是获取访问我网站的用户的登录名。为此,我使用了User.Identity.Name。当您需要知道 Active Directory 域中的哪个用户正在访问您的站点时,这非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2011-12-15
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多