ASP.NET MVC приложение аварийно завершает работу - PullRequest
1 голос
/ 30 ноября 2011

Я создал приложение MVC 2 для работы в качестве RSS-фидера и доставлял новостное содержимое для ряда приложений. Все было хорошо до вчерашнего дня, когда вдруг мое приложение начало выдавать случайную ошибку, которая не говорит мне много о том, что происходит (или, по крайней мере, я этого не понимаю). Эта ошибка возникает только в производственной среде и не может быть воспроизведена во время подготовки или на моем локальном компьютере.

Вот трассировка стека:

Ошибка при выполнении дочернего запроса для обработчика «System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerWrapper'.errorPath: / Android / Выпуск / 2011-11-22 / P1 HostIP: ##. ##. ##. ## в System.Web.HttpServerUtility.ExecuteInternal (обработчик IHttpHandler, TextWriter Writer, логическое preserveForm, логическое setPreviousPage, Путь к VirtualPath, путь к файлу VirtualPath, физический путь строки, исключение ошибка, String queryStringOverride) в System.Web.HttpServerUtility.Execute (обработчик IHttpHandler, TextWriter писатель, логическое preserveForm, логическое setPreviousPage) в System.Web.HttpServerUtility.Execute (обработчик IHttpHandler, TextWriter писатель, логическое preserveForm) в System.Web.HttpServerUtilityWrapper.Execute (обработчик IHttpHandler, Автор TextWriter, логическое preserveForm) в System.Web.Mvc.ViewPage.RenderView (ViewContext viewContext) в System.Web.Mvc.ViewResultBase.ExecuteResult (контекст ControllerContext) на System.Web.Mvc.ControllerActionInvoker. <> c_ DisplayClass14.b _11 () в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (IResultFilter фильтр, ResultExecutingContext preContext, Func 1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func 1 продолжение) в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, IList 1 filters, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.b__4() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8 1.b__7 (IAsyncResult _) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () на System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, Boolean и выполняется синхронно)

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

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Такие византийские ошибки трудно отлаживать. Прослеживаемая трассировка стека не помогает в диагностике ошибки.

Во-первых, вы должны улучшить ведение журнала ошибок. В вашем global.asax создайте реализацию хука Application_Error, который регистрирует исключение и все внутренние исключения в файл (я бы не записывал это в базу данных, потому что соединение БД могло бы быть виновник). Убедитесь, что этот код надежен: он должен фокусироваться на этих критических ошибках, а не регистрировать каждую страницу 404 Также убедитесь, что сам код журнала не создает проблем (он должен быть очень устойчивым к ошибкам).

Причиной возникновения подобных проблем обычно является доступ к некоторым статическим переменным. Я считаю, что из всех ключевых слов static является самым опасным, потому что оно очень тонкое.

Некоторые распространенные ошибки, которые я видел.

  • Кэширование Кто-то хотел быть умным и кэшировать некоторые данные в статическом словаре или около того. К сожалению, код блокировки некорректен. Исключение возникает только в том случае, если код какого-то пользователя пытается добавить sth. в кеш, но он уже есть:

    if(_dict.ContainsKey(cacheKey) == false)
    {
       // second thread adds data to the dictionary here
       _dict.Add(cacheKey, cacheData); // exception
    }
    

    Это также может произойти в сторонней библиотеке, которая использует кэширование или пул. Доступ к статическим переменным с осторожностью.

  • Необычные пути к коду Происходит нечто необычное, когда код вызывается не очень часто, и этот код ошибочен. Если у вас есть тестирование с высоким охватом кода, проверьте места, которые не охвачены тестами.

  • Потеря соединения с БД Сброс сокета на соединении БД может привести к исключениям. Многие библиотеки / драйверы подключений к базам данных исправляют это быстро (то есть следующий запрос будет в порядке). Это трудно справиться; в основном это не должно происходить, но есть много причин, почему это может произойти.

1 голос
/ 30 ноября 2011

Эта ошибка говорит вам, что истинная ошибка где-то в каком-то дочернем действии, то есть действии, отображаемом Html.RenderAction ().

Не существует такой вещи, как «случайная» ошибка - должен быть сценарий, в котором это происходит, вы просто не знаете об этом, потому что, возможно, условия меняются.

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

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