asp.net - 解释一下这个不起眼的 ASP.NET bug

标签 asp.net sql-server

我刚刚将一个网站投入生产,该网站在 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'.

(注意:根命名空间已重命名以保护无辜者。)

然后,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 工作进程崩溃?

最佳答案

它崩溃是因为您的数据访问功能找不到存储过程,并且当您调用它时,由于找不到存储过程,运行时生成了未处理的异常。

至于它杀死了整个 ASP.NET 工作进程,那是因为您遇到了未处理的异常。该进程无法从异常中恢复,因为它没有被处理(没有 try/catch 围绕您的读取等),因此它唯一能做的就是重新启动该进程。

至于为什么 [dbo] 与 [shawn] 会导致崩溃……嗯,这与 SQL Server 中对象的所有权有关。用户无需指定所有者即可访问 DBO 拥有的任何对象,但如果该对象由非 DBO 帐户拥有,则您必须提供完全限定名称。 (即 [shawn].myStoredProcedure)。在这里阅读更多信息:http://www.sqlteam.com/article/understanding-the-difference-between-owners-and-schemas-in-sql-server .

关于asp.net - 解释一下这个不起眼的 ASP.NET bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1724299/

相关文章:

SQL。 COUNT() 函数的错误结果

sql-server - 在 MS SQL Server 上使用 sqlalchemy 定义一个 varbinary(max) 列

ASP.NET - 使用 WCF Web 服务绑定(bind)和 AD 组时出现 IIS7 部署错误 500 24 50

c# - 检查 request.form ["field"] 字符串长度在 ASP.net 中不起作用

asp.net - 让我的 WCF 服务返回 json

c# - 批量插入Sql Server百万条记录

sql - 使用 select 语句中的值将多行插入到某个表中

c# - 从命令行运行 ASP.NET Web 应用程序

C#连接变为空

sql-server - 具有 node.js 和 MS 集成安全性的 Node-SQL