【发布时间】: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