【发布时间】: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