我在其中一个生产箱上看到一个非常奇怪的问题。我们在一台机器上的IIS 6中托管了一个应用程序,前面有一个apache Web服务器。我的应用程序使用ASP.NET Membership进行身份验证,并依赖于会话状态。我现在看到一个问题,一些服务器请求在尝试访问任何会话变量时会遇到空异常,但如果重试请求,则该页面不会出现异常并且行为正常。
我认为这与会话ID cookie有关,要么在请求中被破坏或丢失,但我不知道是什么原因造成的。我之所以认为这是因为看起来ASP.NET似乎没有看到cookie并创建一个新会话,这可以解释为什么变量为空。当它获得异常时,它无法将新的SessionID cookie写回客户端,因此客户端仍然维护原始的SessionID。然后,当发送下一个请求时,将使用原始的SessionID cookie,现在ASP.NET找到并能够检索会话状态。这是纯粹的推测,但似乎符合这些症状。
此网站除了ASP.NET成员资格和ASP.NET会话所需的cookie之外不使用其他cookie,所以我完全不受IE的cookie限制。该网站已经运行了大约8个月,这个问题最近刚刚出现。我已经尝试过IIS重置并实际重启机器,但似乎没有什么能帮助解决这个问题。
更新
以下是一些要求的澄清。
1.)我们的Apache服务器是唯一暴露于互联网的东西。所有请求都通过HTTPS发送到此框。然后,Apache框将通过HTTP转发的所有请求转发到我们的应用程序服务器。这是出于安全原因。我们已经查看Apache是否存在问题,但Apache日志中似乎没有错误。
2.)尝试访问应用程序期望存在于会话中的对象时发生null异常,而不是实际会话对象本身发生的异常。
答案 0 :(得分:0)
我们找到了问题的根源。看起来我们的应用服务器上的IIS元库已损坏。解决此问题的最佳方法是彻底安装IIS,但由于业务限制,这不是我们的选择。因此,另一个解决方案是实际上只为应用程序创建一个新的App Pool。根据一些拥有比我更多的IIS专业知识的人来说,这将在短期内解决问题,但很可能同样的事情会发生在这个应用程序池中。因此,如果再次开始,我们需要创建新的应用程序池。