无法中断 global.asax / Application_Start

Posted

技术标签:

【中文标题】无法中断 global.asax / Application_Start【英文标题】:Can't break in global.asax / Application_Start 【发布时间】:2012-06-04 17:30:36 【问题描述】:

我在Application_Start() 的第一行有一个断点,但 Visual Studio 不会在上面断点。

Visual Studio 已将自己附加到 IIS 工作进程中:

自动附加到机器“SRD00510”上的进程“[2092] w3wp.exe”成功。

我在家庭控制器中的断点确实有效。

更新

我试过了:

iisreset 重新启动视觉工作室 重新启动。 尝试重新安装 aspnet (aspnet_regiis -i)

【问题讨论】:

尝试右键单击项目。调试 > 进入新实例。这样你就可以从一开始就看到发生了什么.. 【参考方案1】:

阅读您的问题,我假设您使用 IIS 进行调试,而不是 Visual Studio 开发服务器。

在这种情况下,调试应用程序启动很棘手,因为它只在应用程序池启动或回收时调用一次。当 Visual Studio 附加到进程时,Application_Start 已经在运行。

诀窍是让应用程序池在不终止您所附加的进程的情况下循环使用。

执行以下操作:

    在 Visual Studio 中(必须以管理员身份运行)设置断点 global.asax.cs 并像往常一样开始调试 (F5)。该页面在 您的网络浏览器,但没有命中断点。 现在的窍门:使用文本编辑器,从它所在的位置打开 web.config 由 IIS 提供,更改它(例如在某处输入一个空行)和 保存。与回收 IIS 中的应用程序池相比,这 让应用程序池回收(并因此运行通过 Application_Start 在 global.asax.cs 下一次网站是 调用)而不会终止您所附加的进程。 在您的网络浏览器中,重新加载页面。现在应该命中断点!

这对我有用(IIS 7.5,VS2015)。

【讨论】:

这仍然适用于第 2 步和第 3 步之间的小修改。更改 web.config 会强制您停止调试,但您可以重新附加到该进程并按照您的说明继续。 @Danation:你是对的。您不应使用当前正在调试的 Visual Studio 实例。要点是您在磁盘上由 IIS 提供服务的位置上编辑 web.config。这可能与您的 Visual Studio 项目所在的位置不同。查看站点根目录在磁盘上的位置的 IIS。相应地改变了我的答案。【参考方案2】:

将此行放在您的 Application_Start() 中。

Debugger.Break();

这将显示一个对话框,让您选择调试器。您可能需要重新启动应用程序池。

【讨论】:

这给了我一个新的视觉工作室实例。 通常,您会得到一个“选择器”表单来选择新的 VS 或当前正在运行的 VS。你没看到? 是的,但我只能选择一个新的 Visual Studio 实例。 在某些情况下,它会列出当前正在运行的 Visual Studio 实例并让您选择它,其他时候您需要启动新实例。无论哪种方式,您都可以使用此方法进行调试。 如果要使用已打开的 Visual Studio 实例,请不要在该实例中使用“开始调试”。相反,请使用浏览器调用您的应用程序。然后,您应该能够使用现有实例。【参考方案3】:

Application_Start() 仅在应用程序启动时运行一次。重新启动应用程序的一些事情是:

web.config 更改 回收工作进程 - 您可以在 IIS 管理器中执行此操作,也可以在命令行中运行 iisreset

【讨论】:

我已经用任务管理器杀死了 w3wp 并试图更改 web.config。 这很奇怪......如果您已经连接,更改 web.config 应该可以做到。您确定正在执行断点处的代码吗?你能把它移到Application_Start()的开头吗?【参考方案4】:

我的解决方案是切换到使用“Visual Studio 开发服务器”来处理应用程序类 (Global.asax) 问题。完成后我切换回 IIS。

【讨论】:

【参考方案5】:

我假设您是通过单击 Visual Studio 中的“调试”按钮来加载应用程序的?这就是我正在做的事情(在 VS 2012 中)并看到了类似的问题。第一次按下该按钮会启动应用程序并正确命中断点。但在我停止调试应用程序本身之后,它似乎继续运行。因此,未来的调试尝试只是附加到现有进程。 “停止调试”按钮旁边有一个“重启”按钮,所以我认为点击它至少会改变一些事情。 调试应用程序未显示在 IIS 管理器中,因此我无法将其停止。同样,iisreset 也不会捕获它。

到目前为止,我唯一想到的就是更改一行代码,从而迫使 Visual Studio 触发构建,然后它会杀死现有的 proc 并重新开始。如果我只想多次穿过那里,那有点烦人。

我不认为这是一个合适的“答案”,但它可能是一个有用的解决方法,直到有人提出真正的答案。

【讨论】:

【参考方案6】:

我之前通过这样做解决了这个问题:

    对我的解决方案运行清理(右键单击解决方案节点并单击清理) 关闭解决方案 文件 -> 在 Visual Studio 上退出 如果您有多个 Visual Studio 实例正在运行,则退出所有实例。确保“devenv.exe”未列在任务管理器的进程中 删除用户选项文件 (.suo),通常与解决方案 (.sln) 文件位于同一目录中 回收 IIS 工作进程,或者如果使用开发服务器,则终止该进程

现在打开您的解决方案并试一试。 (保持你的手指交叉:))

【讨论】:

【参考方案7】:

每当您第一次运行应用程序时,或者说启动应用程序时,都会启动一个 ASP.Net 开发服务器 - 端口 [端口号],

Application_Start() 在应用程序过程中运行一次。

如果您想到达断点,您必须停止 ASP.Net 开发服务器端口并再次运行您的应用程序。

【讨论】:

【参考方案8】:

如果 [2092] w3wp.exe 是您创建的服务,请尝试以下操作: 停止服务 -> 重建服务项目 -> 启动重建服务 -> 尝试调试

【讨论】:

【参考方案9】:

如果使用 IISEXPRESS 不是一种选择,正如@David Perlman 所提到的,我会选择 Logger。 Log4Net 或 NLog 都很好。从长远来看,最好有一个记录器,例如在生产环境中。

namespace DataService

    using NLog;
    public class Global : System.Web.HttpApplication
    
        private Logger log; 
        protected void Application_Start(object sender, EventArgs e)
        
            LogManager.LoadConfiguration("nlog.config");
            log = LogManager.GetCurrentClassLogger(); 
            log.Error($"Read this line in the log specified in nlog.config");
        

【讨论】:

以上是关于无法中断 global.asax / Application_Start的主要内容,如果未能解决你的问题,请参考以下文章

Global.asax无法找到代码隐藏类

Global.asax 中的“解析器错误消息:无法加载类型”

Global.asax中的“分析器错误消息:无法加载类型”

MVC 应用程序 - 从 Global.asax.cs 检索 LoaderExceptions

asp.net c# - 设置会话然后通过 global.asax 重定向用户

“无法加载类型 [Namespace].Global”让我很伤心