Warum wird das Application_Start () -Ereignis nicht ausgelöst, wenn ich meine ASP.NET MVC-App debugge?

68

Ich habe derzeit die folgenden Routinen in meiner Global.asax.csDatei:

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 ...

Wenn ich drücke F5, wird die Anwendung gestartet und wenn ich keine Ansicht Index.aspxim ~/Views/Home/Ordner habe, wird die Fehlermeldung "Ansicht fehlt" angezeigt, obwohl ich die Standardroute neu definiert und die entfernt habe HomeController. Ich würde erwarten, den Routing-Debugger zu bekommen, und wenn nicht, zumindest eine Anfrage für ~/Views/Arrangement/Index.aspx.
Ein Haltepunkt RegisterRoutes(Routetable.Routes);wird beim Debuggen nie erreicht.

Ich habe versucht, VS zu erstellen, neu zu erstellen, neu zu starten, zu reinigen, erneut zu erstellen usw., aber nichts scheint zu funktionieren. Warum führt die Anwendung nicht die aktuelle Version des Codes aus?

Tomas Aschan
quelle
Thomas, es ist ein sehr interessantes Problem :) (+1)
eu-ge-ne
Sind Sie auf Entwicklungswebserver? Überprüfen Sie, ob das gleiche Problem bei Ihrer App unter IIS und dann bei der neuen leeren mvcapp auftritt.
eu-ge-ne
Das Debuggen auf IIS anstelle des Entwicklungswebservers hat nicht geholfen. Ein Haltepunkt in derselben Zeile in einer brandneuen MVC-Anwendung wurde tatsächlich erreicht, sodass wir ihn auf etwas Projektspezifisches eingrenzen können. Was könnte es sein?
Tomas Aschan

Antworten:

108

Ich habe die folgende Antwort auf forums.asp.net gefunden :

Verwenden Sie IIS7 als Server oder als integrierten Webserver? Bei der Verwendung von IIS7 ist mir aufgefallen, dass beim Starten des Debuggers eine Seite aufgerufen und dann Global.asax (die Markup-Datei, nicht Code-Behind) geändert wird, während der Debugger noch ausgeführt wird. Aktualisieren Sie dann die Seite. Haltepunkte in Application_Start werden angezeigt schlagen.

Ich denke, was passiert, ist, dass VS durch Drücken von "Play" den Prozess nur startet und dann an ihn anhängt, aber zu dem Zeitpunkt, an dem er an ihn angehängt wird, ist das Startereignis bereits ausgeführt. Durch Ändern von Global.asax wird die App neu gestartet. Da der Debugger bereits angehängt ist, können Sie den Haltepunkt erreichen. Keine gute Lösung, aber es scheint zu funktionieren.

Das war es, was in meinem Fall geschah.

Vishal Seth
quelle
2
+1 als nützlicher Tipp für IIS7-Benutzer. Möglicherweise haben Sie ein Subdomain-Routing oder einen anderen Grund, warum Sie den integrierten Webserver nicht verwenden können, oder wenn es Probleme mit dem obigen Vorschlag gibt - z. B. beim Bearbeiten eines Teils der Klasse, die Sie debuggen möchten, oder auf andere Weise Ein Neustart der App in VS ist einfach zu bearbeiten web.config siehe meinen Kommentar hier Link
MemeDeveloper
1
Was bedeutet es "die Markup-Datei, nicht Code-Behind"?
user3311522
Mann es funktioniert! Vielen Dank, aber was ist der Grund dafür?
Mox Shah
1
@ user3311522, auf dem Dateisystem finden Sie im Projektordner eine Datei Global.asax und eine Datei Global.asax.cs. Die erste ist die 'Markup-Datei'. Es enthält so etwas wie <%@ Application Codebehind="Global.asax.cs" Inherits="MyApplication" Language="C#" %> . Es kann im Projektmappen- Explorer über die Kontextmenüoption Markup anzeigen für das Element Global.asax geöffnet werden. Das Hinzufügen eines nachgestellten Speicherplatzes und das Speichern der Datei reichen aus, um die Anwendung neu zu starten.
R. Schreurs
WTF. Danke für die Lösung. Es klappt! Aber ... es gibt eine sauberere Möglichkeit, damit umzugehen ... Mit VS 2015 über IIS 8 tritt dieses Problem immer noch auf ...
Marcus Vinicius Pompeu
27

Fügen Sie ein System.Diagnostics.Debugger.Break();zu hinzu Application_Start().
Dies erzwingt einen Haltepunkt.

Diese Zeile sollte auskommentiert werden, um zu vermeiden, dass der Haltepunkt passiert, und #ifdef debugum sicherzugehen, dass die Produktion nie erreicht wird.

JotaBe
quelle
1
Klingt nach wirklich schlechter Praxis - warum sollten Sie Ihren Code mit Anweisungen an die IDE überladen?
Tomas Aschan
10
Überhaupt keine sehr schlechte Praxis. Es ist eine einfache Anweisung, um das Debuggen zu vereinfachen. Mit #ifdef debugkönnen Sie verhindern, dass es in der Produktionsversion kompiliert wird. Und Sie können es vorübergehend verwenden, während Sie es debuggen und schließlich löschen müssen. Bitte lassen Sie mich wissen, welche die besten Praktiken von Debugger.Launch()und sind Debugger.Break(). Diese Dienstprogrammmethoden sind äußerst hilfreich, um das Debuggen von Har-to-Debug-Elementen wie VS-Add-Ins, Windows-Diensten usw. zu erleichtern, ohne den Prozess bei jedem Lauf manuell anhängen zu müssen. Manche Menschen bevorzugen es, puristisch zu sein. Ich bin lieber praktisch.
JotaBe
Ich habe dies in Global.asax versucht und konnte es nicht zum Laufen bringen. YMMV.
J. Polfer
Gute Idee, aber es funktioniert nicht mit Application_Start ().
Telemat
@ Telemat Ich habe es in Application_Start () verwendet. Kompilieren Sie die Debug-Version oder die Release-Version Ihres Codes? Ich weiß nicht, warum es für Sie eine Fälschung sein kann. Was ist das für ein Projekt? Welche Version?
JotaBe
18

Ich glaube, Sie müssen den lokalen Debugging-Server herunterfahren / stoppen, damit das Application_Start()Ereignis erneut ausgelöst wird. Sie sollten in der Taskleiste mit der rechten Maustaste darauf klicken und "Stop" wählen können.

John Rasch
quelle
Ich tat. Und auch heute noch - nach dem Herunterfahren des Computers über Nacht - bleibt das Problem bestehen ...
Tomas Aschan
14

Das Problem ist, dass Application_Start()zuerst Auslöser und dann der Debugger angehängt werden.

Das Ziel ist es also, etwas zu tun, das Application_Start()erneut ausgelöst wird, während es noch läuft. Führen Sie zum Debuggen den Debugger einfach wie gewohnt aus, bearbeiten Sie ihn dann (z. B. fügen Sie eine neue Zeile hinzu) und speichern Sie die Datei web.config.

Paul Totzke
quelle
Es macht mich traurig zu sehen, dass ich gestern zwei positive Stimmen bekommen habe. Sie finden diese Antwort nicht bei den ersten 5 Versuchen. Aber deshalb posten wir!
Paul Totzke
6

Ich habe das Problem gefunden:

Diese MVC-Anwendung war Teil einer größeren Lösung, bei der ich zu einem bestimmten Zeitpunkt ein anderes Projekt für eine x86-Umgebung festgelegt hatte (ich verwende x64). Als ich das tat, waren anscheinend alle anderen Projekte - auch die später hinzugefügten - so eingestellt, dass sie nicht darauf aufbauen Ctrl+Shift+B, und ich nehme an, dass der Debugger deshalb meinen Haltepunkt nicht erreicht hat.

Lösung:

Gehen Sie zu den Eigenschaften der Lösungserstellung (klicken Sie mit der rechten Maustaste auf Lösung, wählen Sie Eigenschaften aus und wählen Sie im Menü links die Option Erstellen aus), und aktivieren Sie das Kontrollkästchen Erstellen neben dem Projektnamen in der Liste.

Tomas Aschan
quelle
5

Ich hatte heute das gleiche Problem und verwendete Local IIS.

Ich glaube, das liegt daran, wie die Seite geladen wird. Sie müssen lediglich einen Haltepunkt in Application_Start einfügen. Führen Sie die Anwendung aus (in meinem Fall zum Anmeldebildschirm) und gehen Sie dann zu web.config. Bearbeiten Sie es - indem Sie einige Leerzeichen hinzufügen. und dann in Browser aktualisieren. Dadurch wird der Haltepunkt bei Application_Start erreicht.

Dev
quelle
1
Dies ist die beste Antwort auf diesen Forumsbeitrag. Sobald ich die Webkonfiguration gespeichert hatte, wurde das application_startEreignis vom Debugger getroffen.
Sunil
4

In meinem Fall habe ich verwendet

Lokaler IIS-Webserver in den Webprojekteinstellungen

und ich wechsle zu Visual Studio Development Server verwenden , und das funktioniert.

Hernaldo Gonzalez
quelle
4

Die folgende Technik hat für mich funktioniert: Eine
einfache Problemumgehung besteht darin, global.asax zu berühren, nachdem der Debugger angehängt wurde, um ein Anwendungsrecycling zu erzwingen. Bei der nächsten Anforderung wird dann der Haltepunkt erreicht, den Sie für Application_Start festgelegt haben.

Ich habe dies hier gefunden:
http://connect.microsoft.com/VisualStudio/feedback/details/634919/cannot-debug-application-start-event-in-global-asax

Rupesh Kumar Tiwari
quelle
Eine weitere Lösung ist debugger.Break ();
Rupesh Kumar Tiwari
3

In meinem Fall lag das Problem zwischen Stuhl und Tastatur. Nach dem Umbenennen der mvc-Projektassembly habe ich vergessen, Global.asax zu aktualisieren, um auf die richtige Klasse zu verweisen. Überprüfen Sie also die "Inherits" in Global.asax (klicken Sie im Visual Studio mit der rechten Maustaste auf Global.asax -> View Markup).

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

ob es wirklich mit Ihrer Global.asax.cs-Klassen- / Namespace-Deklaration übereinstimmt

Ondrej Svejdar
quelle
0

Vielleicht hilft meine Lösung jemandem:

  1. Stoppen Sie den Debugger.
  2. Aktualisieren Sie den RegisterRoutesCode (Beispiel - Hinzufügen \ Entfernen int i = 1;).
  3. Wiederaufbauen.
  4. Platzieren Sie einen Haltepunkt in RegisterRoutes.
Avishay
quelle
0

Ich hatte gerade dieses Problem und wechselte in den Projekteigenschaften -> Web von lokalem IIS zu IIS Express, um es zu klären

Clarkeye
quelle
0

Projekt -> Eigenschaft -> Web

Überprüfen Sie "Native Code".

Geben Sie hier die Bildbeschreibung ein

sc
quelle