Почему IIS Express перезапускает мой пул приложений в приложении MVC
У меня довольно сложное приложение MVC, которое должно инициализироваться при запуске приложения. Я пытаюсь определить причину перезапуска пула приложений после отображения первой страницы MVC. Чтобы диагностировать эту проблему, я поставил точки останова на Application_Start и Application_End. Applicaiton_Start вызывается, как и ожидалось. В конце первой возвращенной страницы HTML/Razor из моего приложения вызывается Application_End. При запросе следующей страницы Application_Start вызывается снова, а затем, кажется, работает, как и ожидалось, без перезапуска.
Я думал, что это было вызвано тем, что Razor компилирует представления во время выполнения, что затем обновляет папку BIN. Я знаю, что IIS и IIS Express перезапускают пул APP при обновлении папки BIN, поэтому я предположил, что компиляция MVC Razor приводила к тому, что процесс IIS перезапускал пул приложений. Чтобы смягчить это, я следовал инструкциям здесь: https://chrismckee.co.uk/asp-net-mvc-compiled-views/ чтобы предварительно скомпилировать мои виды Razor. Я знаю, что теперь они предварительно скомпилированы, так как это обнаружило несколько проблем компиляции [ошибок компиляции], которые не были бы обнаружены до времени выполнения без этих изменений конфигурации, приводящих к усложнению представлений Razor.
Так что вопрос такой:
1) Как я могу определить причину перезапуска пула приложений?
2) Кто-нибудь знает, почему это происходит в приложении MVC и работает в IISExpress?
[... и, конечно, как это предотвратить]
Спасибо
jloper
Обновление № 2:
Я посмотрел Browser Link и быстро понял, что он не нужен и действительно не используется. Я отключаю BrowserLink и, конечно же, исключение исчезает. Теперь Application_Start вызывается, как и ожидалось, Application_End вызывается [и исключение не произошло (System.GetLastError() возвращает null]. Application_Exception никогда не вызывается. Application_Start вызывается второй раз.
Все состояние приложения сбрасывается при вызове Application_End.
Обновление № 1:
Как и предполагалось, я добавил Application_Error и получил последнее исключение, используя Server.GetLastError(). Вот исключение, которое было возвращено:
The thread 0xc4c has exited with code 259 (0x103).
System.Web.HttpException (0x80004005): The controller for path '/__browserLink/requestData/8cf754f80e264fd392f4a0fbffea67e4' was not found or does not implement IController.
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Кроме того, я добавил тот же код в Application_End. В тот момент, когда вызывается Application_End, System.GetLastError() возвращает нули.
3 ответа
Где-то в Интернете я нашел трюк (забудьте где), что вы можете использовать отражение, чтобы получить причину в событии application_end:
Sub Application_End(sender As Object, e As EventArgs)
Dim runtime As HttpRuntime = CType(GetType(HttpRuntime).InvokeMember("_theRuntime", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.GetField, Nothing, Nothing, Nothing), HttpRuntime)
Dim shutDownMessage = CType(runtime.GetType().InvokeMember("_shutDownMessage", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, runtime, Nothing), String)
Dim shutDownStack = CType(runtime.GetType().InvokeMember("_shutDownStack", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, runtime, Nothing), String)
'Log reason
кроме добавления трассировки IIS, это был специфический для кода способ, которым я смог извлечь причину...
Ответ Брайана Мейна отлично сработал, показывая мне сообщение об изменении файла в папке проекта, что вызвало перезапуск.
Для тех, кто заинтересован, вот версия C#.
var runtime = typeof (HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
var shutDownMessage = runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null);
var shutDownStack = runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null);
Ваша проблема - ошибка в функции Visual Browser в Visual Studio. Это было исправлено в обновлении. Примените последнее обновление (обновление 4) к Visual Studio 2013, и ваша проблема должна быть исправлена.