【问题标题】:Lose ASP.NET Session for one request and then regains it on next为一个请求丢失 ASP.NET 会话,然后在下一个请求中重新获得它
【发布时间】:2009-04-29 04:02:01
【问题描述】:

我在我的一个生产盒子上发现了一个非常奇怪的问题。我们在一台机器上托管在 IIS 6 中的应用程序,前面有一个 apache Web 服务器。我的应用程序使用 ASP.NET Membership 进行身份验证并依赖于会话状态。我现在看到一个问题,即某些服务器请求在尝试访问任何会话变量时会遇到空异常,但如果重试请求,页面不会遇到异常并且行为正常。

我认为这与 Session ID cookie 在请求中损坏或丢失有关,但我不知道是什么原因造成的。我相信这是因为 ASP.NET 似乎没有看到 cookie 并创建了一个新会话,这可以解释为什么变量为空。当它得到异常时,它无法将新的 SessionID cookie 写回客户端,所以客户端仍然保持原来的 SessionID。然后在发送下一个请求时,使用原始的 SessionID cookie,现在 ASP.NET 找到并能够检索会话状态。这纯属推测,但似乎符合症状。

此外,除了 ASP.NET Membership 和 ASP.NET Session 所需的 cookie 之外,此站点不使用其他 cookie,因此我完全低于 IE 的 cookie 限制。该网站已经正常运行了大约 8 个月,这个问题最近才出现。我尝试过 IIS 重置并实际重新启动机器,但似乎没有任何解决问题的方法。

更新:

这里有一些被要求的澄清。

1.)我们的 Apache 服务器是唯一暴露在互联网上的东西。所有请求都通过 HTTPS 发送到此框。然后,Apache 框通过 HTTP 将所有请求转发到我们的应用程序服务器。这样做是出于安全原因。我们查看了 Apache 是否可能是问题所在,但 Apache 日志中似乎没有错误。

2.) 尝试访问存储在应用程序期望存在的会话中的对象时发生空异常,而不是实际会话对象本身发生的异常。

【问题讨论】:

  • 您能说明一下您的设置吗?我不知道 IIS 6“前面有一个 apache Web 服务器”是什么意思。什么是实际处理来自网络的 HTTP 请求?此外,实际 Session 对象是否存在空异常,或者只是您希望在 Session 中的对象不存在?其中一件事......好吧,永远不应该发生!即使会话 id cookie 丢失了,ASP.NET 也应该创建一个新的有效 Session 对象。
  • 出于“安全”原因,您将请求从 Apache 机器转发到 IIS 机器?我认为您的网络人员不知道他们在做什么。
  • 我们有一个 DMZ 区域,它基本上是我们应用程序前面的另一层,因此它们不会暴露在网络中。它还允许重写 URL,除非你升级到 IIS7

标签: asp.net session cookies


【解决方案1】:

我们找到了问题的根源。看起来我们的应用服务器上的 IIS 元数据库已损坏。解决此问题的最佳方法是全新安装 IIS,但由于业务限制,这不是我们的选择。所以另一种解决方案是实际上只是为应用程序创建一个新的应用程序池以在其下运行。据一些比我更有 IIS 专业知识的人说,这将在短期内解决问题,但同样的事情很可能会发生在这个 App Pool 上。因此,如果这种情况再次发生,我们需要创建新的应用程序池。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2011-01-09
    • 2016-08-07
    • 2011-05-15
    相关资源
    最近更新 更多