【发布时间】:2014-06-26 17:08:23
【问题描述】:
我有一个相当复杂的 MVC 应用程序,它必须在应用程序启动时进行初始化。我试图诊断为什么应用程序池在第一个 MVC 页面呈现后重新启动。为了诊断这个问题,我在 Application_Start 和 Application_End 上设置了断点。 Applicaiton_Start 按预期调用。在我的应用程序返回的第一个 HTML/Razor 页面结束时,调用 Application_End。在下一页请求中,Application_Start 再次被调用,然后似乎按预期运行而无需重新启动。
我认为这是由 Razor 在运行时编译视图引起的,然后会更新 BIN 文件夹。我知道更新 BIN 文件夹时 IIS 和 IIS Express 会重新启动 APP 池,所以我假设这个 MVC Razor 编译导致 IIS 进程重新启动应用程序池。为了缓解这种情况,我按照此处的说明进行操作:https://chrismckee.co.uk/asp-net-mvc-compiled-views/ 预编译我的 Razor 视图。我知道现在已经预编译了 vie,因为这确实找到了几个编译问题 [编译错误],如果没有这些配置更改导致 Razor 视图的预复杂化,直到运行时才会发现这些问题。
所以问题是这样的:
1) 如何诊断应用程序池重启的原因?
2) 有谁知道为什么在 IISExpress 中运行的 MVC 应用程序会发生这种情况?
[...显然,如何防止它发生]
谢谢
jloper
更新 #2:
我查看了浏览器链接并很快发现它没有必要并且实际上没有被使用。我关闭了 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() 返回空值。
【问题讨论】:
-
看看
Application_Error和Server.GetLastError()怎么样? (将 Elmah 或其他一些日志记录机制添加到您的站点也不是一个坏主意,这样您就可以有更多的洞察力) -
您的问题与 Razor 编译视图无关。这是一个完整的红鲱鱼。 Razor 不会更新 bin 文件夹中的任何内容,视图被编译并存储在临时 asp.net 文件夹中,这不会影响应用程序池。您的应用很可能会抛出某种未被捕获的异常。
-
按照建议:我添加了 Application_Error 并使用 Server.GetLastError() 检索了异常。这是返回的异常:
标签: asp.net-mvc asp.net-mvc-4 iis razor restart