以编程方式诊断由于应用程序回收而导致的ASP.Net会话丢失?

时间:2008-12-30 19:58:31

标签: asp.net asp.net-2.0

我们有一个ASP.Net 2.0(VS2005)应用程序在本地工作正常,但有时在远程服务器上部署时失去会话状态。

我怀疑IIS重新编写应用程序可能会出现问题,从而消除了用户的会话状态。但是,服务器远程不受我们的控制...所以我们不能简单地启动IIS Admin并检查应用程序设置。当然,另一个可能的原因是客户因某些原因拒绝ASP.Net会话cookie。

(我们几乎排除了代码中的错误,因为它是一个简单的应用程序,它从不尝试从Session对象中删除任何东西,但当然......那些是着名的遗言,是吗?)

你会如何以编程方式诊断?

我主要是想弄清楚如何诊断问题;如果过度热心的应用程序回收是罪魁祸首,那么编码就不应该太难了。

我确信这是ASP.Net开发人员的常见问题。

4 个答案:

答案 0 :(得分:3)

如果您可以更改某些设置,以下是一些可能有助于排除故障的链接:

Logging Worker Process Recycling Events in IIS 6.0 (IIS 6.0)

Logging ASP.NET Application Shutdown Events

答案 1 :(得分:1)

将一些日志记录代码添加到global.asax Application_Start方法中,您将能够看到何时/如果您的丢失是由应用程序重新启动引起的(或者至少,您会看到服务器何时启动,如果您知道会议在同一时间丢失,你知道你的罪魁祸首。)

解决方法是使用proc会话状态(如果您没有服务器控件,可能必须是基于SQL的)。您的代码需要一些额外的工作,因为您在Session中存储的所有内容都必须是可序列化的,但解决了应用程序重新启动导致会话丢失的问题。

答案 2 :(得分:0)

在应用程序池中为多个工作线程(Web Garden)配置的IIS可能会导致会话状态丢失。

答案 3 :(得分:0)

我找到了会话丢失的场景 - 在asp.net页面中,对于金额文本框字段具有无效字符,然后是用于其他目的的会话变量检索。在通过转换发布无效数字解析之后。 ToInt32或double引发了第一次机会异常,但错误没有显示在该行,而不是因为未处理的异常,Session为空,在会话检索时显示错误,从而欺骗调试...

提示:测试你的系统是否失败 - 破坏..在不相关的场景中输入足够的垃圾,你也可以在你的本地代码库中重现这台机器......:)

希望它有帮助, hydtechie