【发布时间】:2015-05-28 20:06:10
【问题描述】:
今天我接到了来自我们 ASP.NET 生产系统的用户的紧急电话。一些用户(不是全部)无法输入某些数据。用户发布数据,然后系统冻结;电话再也没有回来。
我们尝试在 QA 系统上重现该问题(该系统具有生产数据的全新恢复),但未能成功。然后我从我的开发环境中运行并直接连接到生产数据库,伪装成受影响的用户之一。再次,没问题。结论:生产环境中一定存在某种问题,可能是在托管网站的 IIS 进程中的某个地方。
所以我在生产服务器上启动了 Visual Studio,并附加到 IIS 进程(孩子们,不要在家里这样做!),在有问题的代码中设置断点,登录作为用户,并试图保存数据。打断点并逐行执行,直到遇到这样的一行代码:
try
{
...
using (var db = new MyDataContext())
{
...
var fooToUpdate = db.Foos.Single(f => f.ID == fooId); // <-- THIS LINE
...
}
}
catch (Exception ex)
{
// some error logging
}
在那一行点击“step”后,线程就消失了。消失得无影无踪。我在数据库上放了一个嗅探器,没有发出任何查询;不用说没有涉及数据库锁定。没有抛出异常。代码进入实体框架,从未离开。
数据的方式是每个用户每天都有一个不同且唯一的fooId,因此其他用户不会有相同的fooId。大多数用户能够加载他们的 Foo,但少数用户始终无法加载他们的个人 Foo。我尝试运行查询以在 SSMS 窗口中加载 Foo;一点问题都没有。唯一一次失败是在生产服务器上的这个特定 IIS 进程中。
现在,我可以回收应用程序池或重新启动 IIS,这可能会解决问题。但是一周前发生了类似的事情,当时我们也无法追踪。所以我们然后重置了 IIS,希望问题会消失。它确实做到了,持续了一周。现在它又回来了。
有没有人知道线程如何像这样简单地蒸发? Norman Bates 是不是躲在 EF 门后?
【问题讨论】:
-
您是否尝试在生产环境中查看事件查看器,是否有任何有意义的消息(如果有)?
标签: c# asp.net-mvc-4 iis-7 entity-framework-5