Asp.net会话数据丢失

4
我之前提到过这个问题,但现在我已经缩小了问题范围,以便回答。首先是一些背景信息。
我有一个ASP.net网站,在本地服务器上正常运行,但当它在外部访问时,会出现一些会导致错误的会话数据问题。第一个问题是与IE9有关的问题。会话变量在达到第二页并且点击存储过程后就无法持久化。我通过强制页面在IE7模式下运行来解决这个问题。
这在某些浏览器上仍然发生(特别是在Firefox中发生一次),但当会话变量为空时,我创建了一个循环将其强制返回菜单页面,因此它看起来像页面没有加载,可以再次按“打开”按钮。
然而,新的问题出现在我尝试在表单上保存数据时。它传递一些会话变量到存储过程接口中(如员工ID等),似乎会超时。然而,webconfig和IIS中设置的所有会话超时时间都非常长(数小时),工作进程被设置为永远不过期或不回收。而且,即使过了一两分钟,它也会发生,所以不能是超时时间的问题。就像它随机失去会话值一样。奇怪的是,如果你回去再次保存-使用相同的数据执行相同的操作-它往往会起作用。有时需要进行几次迭代,但最终它会起作用。
奇怪的是,它倾向于随机丢失ViewState的一些部分-例如字段值-但这可能与自动加载的字段有关,而不是无关的。但我想在这种情况下包括它,以便了解为什么可能会出现这种情况。
我正在考虑一个解决方法,即在页面加载后立即将会话变量转储到ViewState变量中,但我真的想直接解决问题,这样当我不能像那样处理时,我将来就不必再处理它。 IIS(顺便说一句,它是IIS 6)可能是罪魁祸首吗?会话变量只是因为被频繁传输而死亡?我不能说我对服务器设置非常了解,但我从这种情况中学到了很多,并且战胜它将是我士气的巨大胜利。谢谢你阅读并且抱歉太长了!

1
那个服务器上似乎有些问题。这可能与您的应用程序有关,但是 ASP.NET 和 IIS 不会轻易丢失会话数据和视图状态,除非在巨大的负载下。因此,请提供一些性能和负载相关的指标。 - Aliostad
1
顺便说一下,这是一个很好的详细问题,我给它点赞。 - Aliostad
1
我同意你的服务器中有些东西似乎不太对劲,所以我建议你首先检查一下。你似乎在做很多变通来让这个工作。你在会话中存储什么样的数据?顺便说一句:你提供的细节也让我给你加了一个赞。 - bechbd
关于负载,这是我们运行SharePoint的同一台服务器。我们网站的外部流量很少,我正在使用其中一个目录。它也是托管我们其他Web应用程序的所有前端部分的服务器。所有数据都存储在单独的服务器中(包括此应用程序的数据),以及存储过程。所有这些都存储在SQL Server 2008中。通常我只在一个选项卡中运行它,但我尝试过在多个浏览器中运行它。我甚至让其他测试人员在多个浏览器中使用它来测试兼容性(这就是我发现IE 9问题的方式)。 - RobLife
2
你说这个服务器用于其他网站,包括一个SharePoint实例。其他网站工作正常吗?该网站是否是负载均衡设置的一部分?这个表单在你的本地IIS上工作吗? - SCB
显示剩余7条评论
4个回答

0

0

好的!

阅读了您的帖子并思考后,我认为问题最可能的原因是 不靠谱的ISA服务器。代理通常会干扰HTTP内容,决定更改标头等。正如您所提到的,只有在外部访问时才会发生这种情况。这是中间人问题的标志。

现在要证明,您需要比较发送到外部的标头和接收到的标头。这有点困难,但完全不是不可能的。您只需要在服务器端记录所有标头(请求),同时从客户端机器上执行相同操作(也许使用Fiddler)。

这应该能够证明有问题的代理 - 我们公司也有类似的问题。


0

我做了一些事情,现在它可以工作了,但我没有测试哪一个是真正的解决方案,而且据我所知,其中任何一个都不应该真正解决这个问题。首先,在某个时候,我将可用的工作进程从一个增加到三个,我认为这意味着如果需要,用户可以在服务器上运行多个进程,但事实证明这仅适用于服务器群。所以我把它设置回了一个。在出现这个问题时,它就是一个。

我做的第二件事是在一个包含发送会话变量的存储过程接口的私有子程序中添加了一个简单的if语句(如果会话变量为空)。我认为这将是一个解决方法,但然后我看了一下我的旧错误日志,发现甚至不是存储过程接口引发了错误。我不知道为什么它会完全解决这个问题。

我还设置了一些像Rahul链接给我的那个页面上的PerfLogs,以尝试监视会话的情况。

现在除了奇怪的事实,即其中一些尝试中的某些内容(以及我所做的任何其他小事)实际上修复了问题之外,事实是一开始从未发生在本地。我不太确定发生了什么,但现在它可以工作了,我不会再深入挖掘它,因为我有很多项目要处理。在我看来,这很可能是ISA服务器可能在将来出现的问题,但我的知识缺乏阻碍了我真正深入了解。当我询问时,有人告诉我应该允许我发送需要通过它发送的所有内容。无论如何,我很高兴能够继续前进并使其工作。希望所有这些都能帮助处于类似情况的人们!谢谢大家提供的所有帮助!


将工作进程数设置为1将会修复它。如果您想要运行多个进程,您需要使用一个独立于进程的会话状态服务器。 - Andrew Morton

0

这次我真的找到了解决方案。虽然它仍然不太合理,但我想把它带到这里让大家看看。原来,从表中提取的日期之一被存储为空白的会话变量中(尽管不应该),然后以某种方式,即使有一个if语句应该防止它,它也试图将会话的空字符串转换为日期。非常奇怪。好像会话在到达if语句时具有值,然后在检查它是否符合标准后,将其更改为空字符串并引发错误。

所以事实证明这不是一个会话问题,只是一个奇怪的日期问题。它只发生在一个人和表中的一个特定日期上。我通过简单地在其周围放置try-catch来修复它。自那时以来,对于该个体,一切都运作正常。再次感谢大家的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接