【问题标题】:Why does IIS Express Restart my App Pool in MVC Application为什么 IIS Express 在 MVC 应用程序中重新启动我的应用程序池
【发布时间】: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_ErrorServer.GetLastError() 怎么样? (将 Elmah 或其他一些日志记录机制添加到您的站点也不是一个坏主意,这样您就可以有更多的洞察力)
  • 您的问题与 Razor 编译视图无关。这是一个完整的红鲱鱼。 Razor 不会更新 bin 文件夹中的任何内容,视图被编译并存储在临时 asp.net 文件夹中,这不会影响应用程序池。您的应用很可能会抛出某种未被捕获的异常。
  • 按照建议:我添加了 Application_Error 并使用 Server.GetLastError() 检索了异常。这是返回的异常:

标签: asp.net-mvc asp.net-mvc-4 iis razor restart


【解决方案1】:

我在网上某处发现了一个技巧(忘记在哪里),您可以使用反射来获取 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 跟踪之外,这是一种特定于代码的方式,我能够提取原因...

【讨论】:

【解决方案2】:

Brian Main 的回答完美无缺,向我显示项目文件夹中的文件已更改,导致重新启动的消息。

对于那些感兴趣的人,这里是 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);

【讨论】:

    【解决方案3】:

    您的问题是 Visual Studio 的“浏览器链接”功能中的错误。这已在更新中修复。将最新更新(更新 4)应用到 Visual Studio 2013,您的问题应该会得到解决。

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2011-04-21
      • 1970-01-01
      • 2018-09-15
      相关资源
      最近更新 更多