全局.asax断点未被命中

17
我在我的ASP.NET应用程序的C#代码中有一些代码,它们在Global.asax.cs代码文件中。在Application_StartSession_StartApplication_BeginRequest中,我设置了一些断点。但是,这些断点从未被命中过。我在本地机器上使用VS8工作。

以下是我尝试过的:

  • 停止ASP Dev服务器
  • 删除所有ASP.NET临时文件
  • 创建新的Global.asax
  • 关闭VS并重新打开
  • 清理和重建项目

尝试了这些之后,断点仍然不会命中。

为什么会出现这种情况,有任何想法吗?


为什么不尝试在这些事件中加入一些System.Diagnostics.Debug.WriteLine(...);,并在从Visual Studio运行解决方案时检查输出窗口?你看到了什么吗? - Davide Piras
2
请查看这个答案 - 它对你有帮助吗? - Shadow The Spring Wizard
尝试使用IIS,看看它们是否能够命中。 - Erix
有点晚了,但如果您在项目运行时编辑app.config文件,则会触发断点。 - stuartd
检查这个答案,对我有用:https://dev59.com/KHI-5IYBdhLWcg3wO1rl#8834890 - Zoomzoom
显示剩余2条评论
6个回答

31

我也遇到了同样的问题。我猜测你是在使用本地IIS而不是VS开发服务器。如果是这样,由于调试器附加时,Global.asax.cs文件中的代码已经在IIS中执行,因此您将无法调试/步进此代码。但是,如果您使用Dev服务器,则可以访问此代码,因为调试器已经附加。

因此,请在项目属性中更改服务器以使用Visual Studio开发服务器。

在Visual Studio中右键单击您的项目 > 项目属性 > Web选项卡 > 使用Visual Studio开发服务器


4
在VS 2013中,Visual Studio开发服务器丢失了,@Ofiris的答案也没有帮助。 - Osel Miko Dřevorubec
1
在VS 2019中,您可以按照上述步骤操作,但是在Web选项卡中,请查看服务器部分并选择IIS Express。我之前使用的是本地IIS,断点无法正常工作,但切换到IIS Express后问题得到解决。 - Eric Mutta

7
我所做的是在Application_Start()方法中添加:System.Diagnostics.Debugger.Break();

3
在我参与的一个项目中,在以下选项卡中选择了“启动外部程序”选项:

Visual Studio > 项目属性 > Web

这导致断点无法被触发。
将“启动操作”更改为“当前页面”可解决此问题。

2

如另一篇答案所述,Global.asax代码将在调试器附加之前运行。为了解决这个问题,您可以先开始进行调试,然后进入IIS并停止/启动应用程序,这样调试器就能够重新启动。


2

如果你不想使用Visual Studio开发服务器,而是使用IIS,你可以按照以下步骤操作(已在VS2015专业版中测试):

1)应用程序池保持运行状态 - 确保所使用的应用程序池正在运行,方法是访问您的Web应用程序中的页面(它可能由于空闲超时而停止)。

2)附加到进程 - Ctrl-Alt-P 调试->附加到进程 - > 查找与您的应用程序相对应的w3wp进程。

使用ReAttach扩展可以大大加快附加到进程的速度,该扩展会创建到最近附加进程的快捷方式。

3)应用程序池循环 - 确保应用程序池通过进入IIS并对其进行循环或更快地进入web.config,进行无效更改(将一些空白放在标记之外),并保存它。

4)开始调试 - 请求您的Web应用程序中的任何页面以强制初始化。 您应该能够在Global.asax中的任何启动方法中放置和触发断点。

protected void Application_Start()
void Application_BeginRequest(Object sender, EventArgs e)
protected void Session_Start(object sender, EventArgs e)

不是完美但很有用:进入web.config,进行无效更改(在标签外加一些空格),然后保存。值得+1 :) - QMaster

1
我曾经遇到过这个问题两次。第一次出现这种情况时,我进入了“项目属性-〉生成-〉高级...”,并从“调试信息”下拉菜单中选择了“完整”。
第二次,我的global.asax中的断点没有被触发,但是如果我将鼠标悬停在断点上,它会给出警告:“源代码与原始版本不同。”
最后,我弄清楚了,在这种情况下,我备份了该项目以保留代码,并正在使用该副本进行工作。即使它位于不同的文件夹中,它仍在使用原始虚拟目录的dll:http://localhost:4952/ 所以我在“项目属性-〉Web-〉项目URL”中进行了更改。我只是将端口更改为http://localhost:49523/,然后它就可以工作了。
它提示我创建虚拟目录,我选择是,自那以后就没有遇到任何关于断点的问题了。

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