为什么我的IIS7会话中的对象会消失?

4
我正在对我的Web应用程序(IIS7在经典模式下)进行一系列调用。前两个调用实例化对象并将它们放置在Session对象中。
当我进行第三个调用时,会发现Session缺少一个对象。我期望在Session中有2个键,但只有1个。
看起来好像创建了多个会话。需要注意的是,这种情况经常发生,不是100%可重复的,即有时一切正常。
这些对象的大小相当大,但不是特别巨大(约100个小字符串),因此似乎不太可能达到会话大小的上限。我没有在其中放置任何其他对象。

你的调用之间经过了多长时间?你的会话已超时吗?你是否使用正确的键来访问先前存储的值(键区分大小写)?你是否使用调试器检查了Session对象的内容? - slugster
Slugster所说的没错。另外,你是将Session存储在内存(InProc)、数据库还是其他地方呢? - immutabl
这些调用是快速连续的,并且是串行的。会话密钥是数字的,我已经在调试器中检查了会话,只显示一个密钥。 - izb
我正在添加对象,使用Sesson[myKey] = myObject; - izb
1
还有,这里涉及到多少台服务器? - Marc Gravell
这只是一台服务器 - 我的本地开发机器。 - izb
3个回答

3

听起来你遇到了一个未被处理的异常,而你并不知道。在这种异常发生时会销毁会话。

在global.asax中的Application_OnError、Session_End和Session_Start方法中设置断点以检查它们。


会话难道每次出现未处理的异常都会被销毁吗?我可以想象有些情况下可能会被销毁,但我很确定在某些未处理异常后我的会话仍然完好无损... - Chris
我猜我的答案只适用于InProc会话。不幸的是,我无法从MSDN中引用相关内容。 - citronas

1

好的,我解决了这个问题(在citronas的global.asax提示下得到帮助)。

像往常一样,结果是我在问题和评论中断言的事情并不像我所假定的那样真实。

前两个调用实际上并不是串行的,但第二个在第一个返回之前就被调用了。 这导致了两个Session_Start调用(有趣的是具有相同的会话ID)。 因此,第一个会话数据正在被覆盖。

将我的应用程序更改为等待每个调用返回即可解决问题。

感谢所有回答或评论的人。


0

哪一个消失了,是第一个还是最后添加的?您的应用程序似乎在第一次调用后被回收,因此第一个添加的将被擦除。


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