代码重建后,Application_End在调试会话中触发 - ASP.NET MVC

时间:2014-11-17 16:05:36

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

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

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

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

在没有问题的情况下重建代码后,我也可以在VS2013中无需调试运行。

这是失败时的堆栈

    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 methods
  • 中放置一个断点
  • 按F5
    在加载第一页时:
    • Application_start命中 - 正常
    • Application_end被击中 - 糟糕不正常
    • 再次点击Application_start

我不希望应用程序在没有识别的触发器的情况下结束,例如在应用程序运行时更改web.config。为了清楚起见,我的应用程序在任何代码或配置文件结束之前不会对其进行任何更改。

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

app not running - 没有工人进程:

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

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

我希望这更有意义。

1 个答案:

答案 0 :(得分:0)

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

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

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

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