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

我目前在我的 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时,应用程序会启动,除非我在 ~/Views/Home/文件夹中有一个名为 Index.aspx的视图,否则我会得到“视图丢失”错误消息,尽管我已经重新定义了默认路由并删除了 HomeController。我希望得到路由调试器,如果没有,至少请求 ~/Views/Arrangement/Index.aspx
调试时永远不会碰到 RegisterRoutes(Routetable.Routes);上的断点。

我试过建造,重建,重启 VS,清理,重建等,但似乎没有工作。为什么应用程序不运行当前版本的代码?

51294 次浏览

我相信您必须关闭/停止本地调试服务器,以便 Application_Start()事件再次激活... 您应该能够在系统托盘上右键单击它,并选择“停止”。

我发现了问题所在:

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

解决方案:

进入解决方案生成属性(右键单击 Solution,选择 properties,并在左侧菜单上选择 Build) ,然后在列表中项目名称旁边的 Build 复选框中放置一个复选框。

我找到了以下答案 在论坛网站上:

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

我认为现在的情况是,按下“播放”键,VS 就会启动进程,然后连接到它,但是当它连接到它时,启动事件已经运行了。通过更改 Global.asax,您将导致应用程序重新启动,并且由于调试器已经附加,您可以点击断点。虽然不是什么好办法,但看起来很有效。

我的情况就是这样。

System.Diagnostics.Debugger.Break();添加到 Application_Start()
这将强制使用断点。

这一行应该注释掉,以避免断点的发生和 #ifdef debug,以确保永远不会到达生产。

注意: 这是 IIS 的一个问题。自从我写了这个答案以来,情况发生了变化,您可以通过使用其他服务器(如 IISExpress)来避免这样做。

在我的例子中,问题出在椅子和键盘之间——在重命名 mvc 项目汇编之后,我忘记更新 Global.asax 以指向正确的类。因此,请检查 Global.asax 中的“ Heritage its”(在 Visual Studio 中,右键单击 Global.asax-> View Markup)

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

如果它真的与 Global.asax.cs 类/名称空间声明匹配

对我来说

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

我换成 使用 VisualStudio 开发服务器这样就行了。

下面的方法对我很有效:
简单的解决方法是在附加调试器后触摸 global.asax,以强制应用程序回收。然后在下一个请求期间,将触发在 Application _ Start 上设置的断点。

我在这里找到了这个 http://connect.microsoft.com/visualstudio/feedback/details/634919/cannot-debug-application-start-event-in-global-asax :

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

我相信之所以会出现这种情况,是因为页面加载的方式。 您所需要做的就是在 Application _ Start 中放置一个断点。运行应用程序(在我的例子中,它转到 Login Screen) ,然后转到 web.config。编辑它-通过添加一些空格。然后刷新 Browser.that 将到达 Application _ Start 上的断点。

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

所以我们的目标是在 Application_Start()还在运行的时候再次触发它。出于调试目的,只需像通常那样运行调试器,然后编辑(例如添加一个新行)并保存 web.config 文件。

也许我的解决方案能帮到别人:

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

我刚刚遇到了这个问题,并在项目 properties-> web 中从 Local IIS 切换到 IIS Express 来解决这个问题

项目-> 物业-> 网页

检查“原生代码”。

enter image description here