为什么在调试ASP.NET MVC应用程序时未触发Application_Start()事件?


68

我的文件中目前包含以下例程Global.asax.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        "Default",                                          
        "{controller}/{action}/{id}",                       
        new { controller = "Arrangement", action = "Index", id = "" }
    );
}

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    // Debugs the routes with Phil Haacks routing debugger (link below)
    RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}

路由调试器...

当我点击时F5,应用程序启动,除非我已经Index.aspx~/Views/Home/文件夹中命名了视图,否则会收到“视图丢失”错误消息,尽管我已经重新定义了默认路由并删除了HomeController。我希望得到路由调试器,如果没有,至少要有一个请求~/Views/Arrangement/Index.aspx。调试时永远不会遇到
断点RegisterRoutes(Routetable.Routes);

我尝试过构建,重建,重新启动VS,清理,再次重建等,但似乎没有任何效果。为什么应用程序不运行当前版本的代码?


托马斯,这是一个非常有趣的问题:)(+1)
eu-ge-ne

您在开发Web服务器上吗?检查在IIS下使用您的应用程序,然后在新的空mvcapp中是否存在相同的问题?
eu-ge-ne,2009年

在IIS而不是开发Web服务器上进行调试没有帮助。确实在全新MVC应用程序的同一行上出现了一个断点,因此我们可以将其范围缩小到特定于项目的范围。会是什么呢?
Tomas Aschan,2009年

Answers:


108

在forums.asp.net上找到了以下答案:

您是使用IIS7作为服务器还是内置的Web服务器?我注意到使用IIS7时,如果启动调试器,请打开页面,然后在调试器仍运行时更改Global.asax(标记文件,而不是代码隐藏的),然后刷新页面,Application_Start中的断点将为击中。

我认为正在发生的事情是,按下“播放”,VS会启动该过程,然后附加到该过程,但是到它附加到它时,开始事件已经运行。通过更改Global.asax,您将导致应用程序重新启动,并且由于调试器已经连接,您可以命中断点。这不是一个很好的解决方案,但它似乎有效。

这就是我的情况。


2
+1是对IIS7用户有用的提示。也许您有子域路由或某些其他原因无法使用内置的Web服务器,或者上述建议有任何问题-例如,编辑您要调试的部分类,另一种强制方式在VS中轻松重新启动应用程序是编辑web.config,请参阅我的评论此处链接
MemeDeveloper 2011年

1
什么是“标记文件,而不是代码隐藏的”?
user3311522 2014年

伙计,它的作品!多谢,但这背后的原因是什么?
Mox Shah 2014年

1
@ user3311522,在文件系统上,您将在项目文件夹中找到文件Global.asax和文件Global.asax.cs。第一个是“标记文件”。它包含类似的内容<%@ Application Codebehind="Global.asax.cs" Inherits="MyApplication" Language="C#" %> 。可以从解决方案资源管理器中通过Global.asax项上的上下文菜单选项“查看标记”打开它。添加尾随空格并保存文件就足以重新启动应用程序。
R. Schreurs,2015年

WTF。谢谢解决方案。有用!但是...有一种更清洁的方式来解决这个问题...在IIS 8上使用VS 2015时,仍然会出现此问题...
Marcus Vinicius Pompeu 16-4-9

27

一个添加System.Diagnostics.Debugger.Break();Application_Start()
这将导致断点。

此行应注释掉,以避免happern和 #ifdef debug确保永远不会投入生产。


1
听起来是很不对劲的做法-为什么您要使用对IDE的指令来使代码混乱?
Tomas Aschan 2012年

10
根本不是一个非常糟糕的做法。这是使调试更容易的简单说明。使用#ifdef debug使您避免在生产版本上编译它。您可以在需要调试并最终将其删除时临时使用它。请让我知道whihc是最佳实践Debugger.Launch()Debugger.Break()。该实用程序方法非常有用,可帮助调试诸如VS加载项,Windows服务等难以调试的东西,而无需在每次运行时都手动附加进程。有些人更喜欢纯粹主义者。我喜欢务实。
JotaBe 2012年

我尝试在Global.asax中执行此操作,但无法使其正常工作。YMMV。
J. Polfer 2013年

好主意,但不适用于Application_Start()。
Telemat

@Telemat我在Application_Start()中使用了它。您正在编译代码的Debug版本还是Release版本?我不知道为什么它会对您不利。这是什么样的项目?哪个版本?
JotaBe 2015年

18

我相信您必须关闭/停止本地调试服务器才能Application_Start()再次触发该事件...您应该能够在系统任务栏中右键单击它,然后选择“停止”。


是的 直到今天-在一夜之间关闭计算机后-问题仍然存在...
Tomas Aschan

14

问题是Application_Start()先触发,然后调试器附加。

因此,目标是做一些Application_Start()在其仍在运行时会再次触发的事情。为了进行调试,只需像平常一样运行调试器,然后编辑(例如,添加换行符)并保存web.config文件即可。


这让我伤心此获得2 upvotes昨天看到的。您在前5次尝试中都找不到此答案。但是,这就是为什么我们要发布!
Paul Totzke,

6

我发现了问题:

这个MVC应用程序是一个更大的解决方案的一部分,在该解决方案中,我曾经设置了另一个项目来为x86环境(我正在运行x64)进行构建。当我这样做时,显然所有其他项目-甚至是以后添加的项目-都不会在上构建Ctrl+Shift+B,因此我认为这就是调试器未达到断点的原因。

解:

进入解决方案构建属性(右键单击“解决方案”,选择属性,然后在左侧菜单上选择“构建”),然后在列表中项目名称旁边的“构建”复选框中打勾。


5

我今天遇到同样的问题,并且正在使用本地IIS。

我相信这是由于页面加载方式引起的。您需要做的就是在Application_Start中放置一个断点。运行该应用程序(以我为例,它进入了Login Screen),然后转到web.config。编辑它-通过添加一些空格。然后在浏览器中刷新。这将在Application_Start上达到断点。


1
这是此论坛帖子的最佳答案。一旦保存了Web配置,该application_start事件就会被调试器击中。
Sunil

4

就我而言

本地IIS Web服务器Web项目设置中的

并且我更改为Use Visual Studio Development Server,并且可以使用。



3

就我而言,问题出在椅子和键盘之间-重命名mvc项目程序集后,我忘了更新Global.asax以指向正确的类。因此,请检查Global.asax中的“继承”(在Visual Studio中,右键单击Global.asax->视图标记)

<%@ Application Codebehind="Global.asax.cs" 
  Inherits="Monster.MgsMvc.Web.MvcApplication" 
  Language="C#" %>

如果它确实与您的Global.asax.cs类/命名空间声明匹配


0

也许我的解决方案可以帮助某人:

  1. 停止调试器。
  2. 更新RegisterRoutes代码(示例-add \ remove int i = 1;)。
  3. 重建。
  4. 在中放置一个断点RegisterRoutes

0

我刚刚遇到了这个问题,并在项目属性-> web中将其从本地IIS替换为IIS Express。


0

项目->属性->网络

检查“本机代码”。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.