【问题标题】:Application_End fired in Debug Session after Code Rebuild - ASP.NET MVC代码重建后在调试会话中触发 Application_End - ASP.NET MVC
【发布时间】:2014-11-17 16:05:36
【问题描述】:

在更改代码后调试代码时遇到问题。

每次我更改代码时都会触发Application_End。应用程序再次启动,但会话状态已丢失!如果我再次调试应用程序就很好 - 它不会重新启动或丢失会话!

此错误仅在使用 IIS Express 8 进行本地调试 (VS2013) 时发生。我已将 IIS 发布到我的计算机,并且没有运行时问题。这可以通过查看事件日志来确认。

我在VS2013中重新编译代码后也可以不debug运行。

这是失败时的堆栈

    System.Web.dll!System.Web.HttpApplication.InvokeMethodWithAssert(System.Reflection.MethodInfo method, int paramCount, object eventSource, System.EventArgs eventArgs)   Unknown
    System.Web.dll!System.Web.HttpApplication.ProcessSpecialRequest(System.Web.HttpContext context, System.Reflection.MethodInfo method, int paramCount, object eventSource, System.EventArgs eventArgs, System.Web.SessionState.HttpSessionState session)  Unknown
>   System.Web.dll!System.Web.HttpApplicationFactory.FireApplicationOnEnd() Unknown
    System.Web.dll!System.Web.HttpApplicationFactory.Dispose()  Unknown
    System.Web.dll!System.Web.HttpRuntime.Dispose() Unknown
    System.Web.dll!System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(object state)  Unknown
    mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state)  Unknown
    mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
    mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()  Unknown
    mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()    Unknown
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() Unknown
    [Native to Managed Transition]  

谁能帮我理解为什么会这样?

编辑
我发现这仅在采用重建选项在代码更改后采用 F5 时才会发生。选择任何 Build 选项后按 F5 即可。

F5 必须进行重建并进入竞态条件。必须启动应用程序,同时必须进行编译,导致应用程序结束然后重新启动,因为自应用程序最初启动以来依赖文件已更改。

这只是本能 - 任何人都可以确认并让我放心吗?

编辑 2
我需要说明清楚。

触发 application_end 并丢失会话的步骤:
应用程序未运行 - 没有 IIS Express 工作进程

  • 修改代码
  • 在 Global.asax.cs application_start 和 application_end 方法中放置断点
  • 按 F5
    在加载第一页期间:
    • Application_start 被命中 - 良好且正常
    • Application_end 被命中 - 坏不正常
    • Application_start 再次命中

如果应用程序运行时更改 web.config 等可识别的触发器,我不希望应用程序结束。需要明确的是,我的应用程序在结束之前没有对任何代码或配置文件进行任何更改。

我发现我可以通过在按 F5 之前构建 来防止这种情况发生。相反,如果我在 F5 之前重建它会失败。所以要清楚:

应用未运行 - 没有工作进程:

  • 代码更改 + F5 = 失败
  • 代码更改 + 构建 + F5 = 成功
  • 代码更改 + 重建 + F5 = 失败

如果在按下 F5 之前 IIS 没有运行,我不希望在代码更改后 F5 失败。我意识到程序集在编译期间发生了更改,这将导致应用程序池回收如果 IIS 已启动,但事实并非如此。

我希望这更有意义。

【问题讨论】:

  • 很明显,如果您有代码更改...项目将重新卸载、编译并从头开始运行。

标签: asp.net-mvc visual-studio-debugging iis-express


【解决方案1】:

您的问题有点不清楚 - 当您说在调试时更改代码时,您的意思是使用“编辑并继续”功能吗?那么您是在调试会话期间对代码进行更改吗?

无论哪种方式,我都会认为这是预期的行为。如果您更改代码,应用程序将被卸载并重新加载,这自然会导致您的会话状态丢失。您希望看到什么行为?到目前为止,它的行为是否有所不同?

您可以从堆栈跟踪的这一行中看到 AppDomain 正在被卸载:

System.Web.dll!System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(object state)

【讨论】:

  • 进行了代码更改,然后我尝试调试 F5。除非发生通常的触发器,否则我不会期望应用程序结束,例如:池回收;依赖文件更改等。如果我在应用程序运行时重新编译文件,我可以理解它。不过我并没有这样做——这只是一个开发中的应用程序,我正在调试它,因为我做出了不起作用的更改。顺便说一句 - 我已进一步跟踪问题并在您回复时编辑了帖子。感谢您的回复。
  • 应用程序将在您更改任何代码时结束,但这是非常标准的。如果您在 IIS 下运行并将新的 .dll 放入 bin 文件夹,您会发现完全相同的行为 - 应用程序池不会回收,但您的应用程序将重新启动,因为 .NET 运行时将重新加载应用程序域以考虑新的二进制文件。
  • 该应用程序尚未运行。这是我正在开发和启动/调试的应用程序,因为我进行了不起作用的更改。只要我不更改 web.config 或加载/更改 app_code 中的文件等,我是否应该能够更改我的代码,然后使用 F5 启动/调试而不结束我的应用程序?这显然是我对调试工作方式的误解,因为我对 .NET 还很陌生 - 感谢迄今为止的帮助。
  • @radiator - 你的 cmets 令人困惑。请解释“应用程序没有运行”,同时说“没有我的应用程序结束”。如果它没有运行,它会如何结束?您的困惑是您认为当您停止调试时,它会停止应用程序,或者当您不执行网页时,应用程序不会运行。这是。应用程序一直运行,直到应用程序池关闭。当您进行代码更改时,它会重新加载应用程序池,转储您可能拥有的任何会话。例外情况是启用“编辑并继续”时,这不是默认设置。
  • Erik - 超出我的想象 - 当我结束调试时,应用程序仍在运行什么? IIS Express 图标从系统托盘中消失,IIS Express 系统托盘和工作进程在任务管理器中结束。
猜你喜欢
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多