Объясните эту неясную ошибку ASP.NET - PullRequest
4 голосов
/ 12 ноября 2009

Я просто подталкивал веб-сайт к производству, который отлично работал в среде 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?

Ответы [ 2 ]

3 голосов
/ 12 ноября 2009

Сбой из-за того, что вашей функции доступа к данным не удалось найти хранимую процедуру, и когда вы ее вызвали, ну, поскольку хранимая процедура не может быть найдена, во время выполнения возникло необработанное исключение.

Что касается уничтожения всего рабочего процесса ASP.NET, то это потому, что у вас было необработанное исключение. Процесс не смог восстановиться после исключения, потому что он не был обработан (без попыток / перехвата чтения и т. Д.), Поэтому единственное, что он мог сделать, это перезапустить процесс.

Что касается того, почему [dbo] против [shawn] вызывает сбой ... ну, это связано с владением объектами в SQL Server. Пользователи могут получить доступ к любому объекту, принадлежащему DBO, без указания владельца, но если объект принадлежит учетной записи, которая НЕ является DBO, вы должны указать полное имя. (т.е. [шон] .myStoredProcedure). Подробнее здесь: http://www.sqlteam.com/article/understanding-the-difference-between-owners-and-schemas-in-sql-server.

0 голосов
/ 13 ноября 2009

Вы, должно быть, делаете что-то действительно необычное, чтобы остановить рабочий процесс. Он не имеет ничего общего с ошибкой базы данных - он должен быть связан с тем, где эта ошибка происходит в вашем коде, вероятно, в фоновом потоке, но даже тогда ASP.NET, как правило, защищает себя от сбоя при необработанных исключениях.

Рекомендуется всегда заключать весь код в любые методы, выполняемые в потоках, с помощью try-catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...