我只是将一个网站推向生产,这在QA环境中运行良好。该补丁涉及DLL依赖更新和一些数据库脚本。
我将切入追逐并解释我花了4个小时才弄明白的错误。我的一个数据库脚本创建了一个存储过程,在其名称之前缺少[dbo]。所以没有变成[dbo]。[myProcedure]它变成了[shawn]。[myProcedure]。当脚本通过System.Data.SqlClient库从代码执行时,它会终止整个ASP.NET工作进程。这导致应用程序重新启动并将我重定向回登录屏幕。这个程序只是有条件地调用,而且很少,因此难以重现。
因为它取消了整个ASP.NET工作进程,所以调试非常困难。我无法捕捉错误。最后我在Windows事件日志中注意到了这一点:
Exception: System.Runtime.Serialization.SerializationException
Message: Unable to find assembly 'Shawn.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null'.
(注意:Root命名空间已重命名以保护无辜者。)
然后,2秒钟后:
EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.3959, P3 45d6968e, P4 mscorlib, P5 2.0.0.0, P6 4889dc80, P7 4687, P8 4b, P9 shawn.data.dataaccess, P10 NIL.
此时我认为这是一个不匹配的程序集版本,GAC冲突?或类似的东西。我检查了整个项目的每个参考,并尝试了大量不同的东西。我最终查找了对名称空间Shawn.Data.DataAccess的所有引用,并每隔几行记录到一个文件,以查找应用程序失败的位置。这导致我正确的存储过程。
TLDR:为什么单个脚本上缺少[dbo]会导致整个ASP.NET工作进程崩溃?
答案 0 :(得分:3)
崩溃是因为您的数据访问功能无法找到存储过程,并且当您调用它时,由于无法找到存储过程,因此运行时会生成未处理的异常。
至于它会杀死整个ASP.NET工作进程,那是因为你有一个未处理的异常。该进程无法从异常中恢复,因为它没有被处理(没有尝试/捕获您的读取等),因此它唯一能做的就是重新启动进程。
至于[dbo]与[shawn]导致崩溃的原因......好吧,这与SQL Server中对象的所有权有关。用户可以在不指定所有者的情况下访问DBO拥有的任何对象,但如果该对象由非DBO的帐户拥有,则必须提供完全限定的名称。 (即[shawn] .myStoredProcedure)。在此处阅读更多内容:http://www.sqlteam.com/article/understanding-the-difference-between-owners-and-schemas-in-sql-server。
答案 1 :(得分:0)
你必须做一些非常不寻常的事情来打倒工人的过程。它与数据库错误没有任何关系 - 它必须与代码中发生错误的地方有关,可能在后台线程上,但即便如此,ASP.NET通常也会保护自己免受未捕获的异常的影响。
最佳做法是始终将所有代码包含在使用try-catch在线程上执行的任何方法中。