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

Tom*_*han 68 debugging asp.net-mvc compilation

我目前在我的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);
}
Run Code Online (Sandbox Code Playgroud)

路由调试器 ......

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

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

Vis*_*eth 107

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

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

我认为正在发生的事情是按下"播放",VS只是启动进程,然后附加到它,但是当它附加到它时,启动事件已经运行.通过更改Global.asax,您可以重新启动应用程序,并且由于调试器已经连接,您可以访问断点.不是一个很好的解决方案,但似乎有效.

多数民众赞成在我的情况下发生了什么.

  • +1是对IIS7用户有用的提示。也许您有子域路由或某些其他原因无法使用内置的Web服务器,或者上述建议有任何问题-例如,编辑您要调试的部分类,另一种强制方式在VS中轻松重新启动应用程序是编辑web.config,请参阅我的评论[link](http://stackoverflow.com/questions/641148/application-start-not-firing/7655582#7655582) (2认同)
  • @user3311522,在文件系统上,您将在项目文件夹中找到一个文件 Global.asax 和一个文件 Global.asax.cs。第一个是“标记文件”。它包含类似 `<%@ Application Codebehind="Global.asax.cs" Inherits="MyApplication" Language="C#" %> ` 的内容。可以通过 Global.asax 项上的上下文菜单选项“查看标记”从“解决方案资源管理器”打开它。添加尾随空格并保存文件就足以重新启动应用程序。 (2认同)

Jot*_*aBe 25

添加System.Diagnostics.Debugger.Break();Application_Start().
这将迫使断点.

这行应该被注释掉,以避免断点被happern并#ifdef debug确保永远不会生产.

  • 根本不是一个非常糟糕的做法.这是一个简单的指令,使调试更容易.使用`#ifdef debug`可以避免在生产版本上编译它.您可以在需要调试并最终删除它时暂时使用它.请让我知道`Debugger.Launch()`和`Debugger.Break()`的最佳实践.此实用程序方法非常有助于调试难以调试的事情,如VS加载项,Windows服务等,而无需在每次运行时手动附加进程.有些人更喜欢纯粹主义.我更喜欢实用. (9认同)

Joh*_*sch 18

我相信您必须关闭/停止本地调试服务器才能Application_Start()再次触发事件...您应该能够在系统托盘中右键单击它并选择"停止".

  • 辉煌.(1) (5认同)

Pau*_*zke 13

问题是Application_Start()首先触发调试器附加的触发器.

所以我们的目标是做一些Application_Start()在它仍然运行时会再次触发的事情.出于调试目的,只需像通常那样运行调试器然后编辑(例如添加换行符)并保存web.config文件.


Tom*_*han 6

我发现了问题:

这个MVC应用程序是一个更大的解决方案的一部分,我曾在其中设置了另一个项目来构建x86环境(我正在运行x64).当我这样做时,显然所有其他项目 - 甚至是后来添加的项目 - 都没有建立起来Ctrl+Shift+B,我想这就是为什么调试器没有达到我的断点.

解:

进入解决方案构建属性(右键单击Solution,选择属性,然后选择左侧菜单上的Build),并选中列表中项目名称旁边的Build复选框.


Dev*_*Dev 5

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

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