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

时间:2009-06-09 01:51:22

标签: asp.net-mvc debugging 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);
}

Routing debugger ...

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

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

12 个答案:

答案 0 :(得分:102)

我找到了以下答案on forums.asp.net

  

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

     

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

这就是我的情况。

答案 1 :(得分:25)

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

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

答案 2 :(得分:18)

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:6)

我发现了问题:

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

解决方案:

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

答案 5 :(得分:5)

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

我相信这是因为页面加载的方式。 您需要做的就是在Application_Start中放置一个断点。运行应用程序(在我的情况下,它进入登录屏幕),然后转到web.config。编辑它 - 添加一些空格。然后在Browser.t中刷新,这将在Application_Start上点击断点。

答案 6 :(得分:4)

在我的情况下,我使用

Web项目设置中的

本地IIS Web服务器

我改为使用Visual Studio开发服务器,这样可行。

答案 7 :(得分:4)

以下技术对我有用:
简单的解决方法是在附加调试器后触摸global.asax以强制应用程序回收。然后在下一个请求期间,您在Application_Start上设置的断点将被命中。

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

答案 8 :(得分: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类/名称空间声明匹配

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

我刚刚遇到此问题并在项目属性中从本地IIS交换到IIS Express - &gt;网络将其整理出来

答案 11 :(得分:0)

项目 - &gt; property - &gt;网站

检查&#34;原生代码&#34;。

enter image description here