无法中断 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()
仅在应用程序启动时运行一次。重新启动应用程序的一些事情是:
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 中的“解析器错误消息:无法加载类型”
MVC 应用程序 - 从 Global.asax.cs 检索 LoaderExceptions