无法进入 global.asax / Application_Start 函数

31

我在Application_Start()的第一行设置了断点,但是Visual Studio不会在此处中断。

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

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

我的主页控制器中的断点可以工作。

更新

我尝试过:

  • iisreset
  • 重新启动Visual Studio
  • 重启计算机。
  • 尝试重新安装aspnet (aspnet_regiis -i)

尝试右键单击项目,调试>步入新实例。这样您就可以从头开始看到发生了什么。 - jrb
9个回答

61

阅读您的问题,我假设您正在使用IIS进行调试,而不是使用Visual Studio Development Server。

在这种情况下,调试应用程序启动十分棘手,因为它仅在应用程序池启动或重新启动时调用一次。当Visual Studio附加到进程时,Application_Start已经运行过了。

诀窍在于使应用程序池重新启动而不终止您附加的进程。

请按照以下步骤操作:

  1. 在Visual Studio(必须以管理员身份运行)中,在global.asax.cs中设置断点,然后像往常一样开始调试(F5)。页面将在Web浏览器中打开,但断点不会被命中。
  2. 现在来个诀窍:使用文本编辑器打开由IIS提供的web.config文件,并更改它(例如在某处输入一个空行),然后保存。与在IIS中重启应用程序池不同,这将使应用程序池重新启动(并因此在下次调用网站时通过global.asax.cs运行Application_Start),而不终止您附加的进程。
  3. 在Web浏览器中,重新加载页面。现在应该会命中断点!

对我有效(IIS 7.5,VS2015)。


1
这仍然可以工作,只需要在第2步和第3步之间进行微小的修改。更改web.config会强制您停止调试,但是您可以重新附加到进程并像您所述的那样继续。 - Danation
@Danation:你说得对。你不应该使用你当前正在调试的 Visual Studio 实例。主要问题是你需要在 IIS 提供服务的磁盘位置上编辑 web.config。这可能与你的 Visual Studio 项目所在的位置不同。请查看 IIS,找到站点根目录在磁盘上的位置。我已相应地修改了我的答案。 - Jochen

14

将此行代码放置于 Application_Start() 中。

Debugger.Break();

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


1
这会给我一个新的 Visual Studio 实例。 - jgauffin
通常,您会得到一个“选择器”表单来选择新的VS或当前正在运行的VS。您没有看到吗? - spender
是的,但我只能选择一个新的Visual Studio实例。 - jgauffin
在某些情况下,它会列出当前运行的Visual Studio实例并让您选择使用该实例进行调试;其他情况下,您需要启动新的实例。无论哪种方式,您都可以使用此方法进行调试。 - Razor
如果您想使用已经打开的 Visual Studio 实例,请不要在该实例中使用“开始调试”。相反,使用浏览器来调用您的应用程序。然后,您应该能够使用现有的实例。 - Holistic Developer

6

Application_Start() 仅在应用程序启动时运行一次。重新启动应用程序的几个因素包括:

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

我用任务管理器结束了w3wp进程,并尝试更改web.config文件。 - jgauffin
很奇怪……如果你已经连接上了,改变web.config文件应该就可以了。你确定断点处的代码正在执行吗?你能把它移到Application_Start()方法的开头去吗? - jrummell

2

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


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

0

我以前通过以下方法解决过这个问题:

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

现在打开您的解决方案并尝试一下。(祝你好运 :))


0
每当您第一次运行应用程序或启动应用程序时,都会启动一个ASP.Net开发服务器 - 端口[端口号], Application_Start()在应用程序的过程中只运行一次。
如果您想要达到断点,请停止ASP.Net开发服务器端口并再次运行您的应用程序。

0
我猜你是通过在Visual Studio中点击“调试”按钮来加载应用程序的?这就是我所做的(在VS 2012中),并且遇到了类似的问题。第一次按下该按钮会启动应用程序并正确命中断点。但是似乎在停止调试后,应用程序本身仍在运行。因此,以后尝试调试只需连接到现有进程即可。
“停止调试”按钮旁边有一个“重新启动”按钮,因此我认为单击该按钮至少会改变一些东西。 调试应用程序不会显示在IIS管理器中,因此我无法在那里停止它。同样,iisreset也无法捕获它。
到目前为止,我唯一想到的办法是更改一行代码,从而强制Visual Studio触发构建,然后它会杀死现有进程并重新启动。如果我只想多次步进,这种情况有点恼人。
我认为这不是一个适当的“答案”,但这可能是一个有用的解决方法,直到有人带着真正的答案进来。

0
如果不能使用IISEXPRESS,如@David Perlman所提到的,我会选择一个记录器。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");
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接