web-dev-qa-db-fra.com

Pourquoi l'événement Application_Start () n'est pas déclenché lorsque je débogue mon application ASP.NET MVC?

J'ai actuellement les routines suivantes dans mon fichier 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);
}

Routage du débogueur ...

Lorsque je clique sur F5, l'application se lance et à moins d'avoir une vue nommée Index.aspx dans le dossier ~/Views/Home/, le message d'erreur "Voir les éléments manquants" s'affiche, même si j'ai redéfini la route par défaut et supprimé la variable HomeController. Je m'attendrais à obtenir le débogueur de routage, et sinon, au moins une demande pour ~/Views/Arrangement/Index.aspx.
Un point d'arrêt sur RegisterRoutes(Routetable.Routes); n'est jamais atteint lors du débogage.

J'ai essayé de construire, de reconstruire, de redémarrer des VS, de nettoyer, de reconstruire à nouveau, etc., mais rien ne semble fonctionner. Pourquoi l'application n'exécute-t-elle pas la version actuelle du code?

61
Tomas Aschan

J'ai trouvé le problème:

Cette application MVC faisait partie d’une solution plus vaste, dans laquelle j’avais à un moment donné défini un autre projet à construire pour un environnement x86 (j’exécutais x64). Lorsque j'ai fait cela, apparemment, tous les autres projets - même ceux ajoutés plus tard - étaient définis pour ne pas s'appuyer sur Ctrl+Shift+B, et je suppose que c'est pourquoi le débogueur n'a pas atteint mon point d'arrêt.

Solution:

Accédez aux propriétés de construction de la solution (cliquez avec le bouton droit de la souris sur Solution, sélectionnez Propriétés, puis sélectionnez Construire dans le menu de gauche), puis cochez la case Construire en regard du nom du projet dans la liste.

6
Tomas Aschan

J'ai trouvé la réponse suivante sur forums.asp.net :

Utilisez-vous IIS7 en tant que serveur ou serveur Web intégré? Lors de l’utilisation de IIS7, j’ai remarqué que si vous démarrez le débogueur, laissez une page apparaître, puis modifiez Global.asax (le fichier de balisage, pas le code en retard) pendant que le débogueur est toujours en cours d’exécution, puis actualisez la page, les points de rupture dans Application_Start frappé.

Je pense que ce qui se passe, c’est que si on appuie sur "play", VS déclenche le processus, puis s’attache à celui-ci, mais au moment où il s’y rattache, l’événement de départ est déjà terminé. En modifiant Global.asax, vous redémarrez l'application et, étant donné que le débogueur est déjà attaché, vous pouvez atteindre le point d'arrêt. Pas une bonne solution, mais cela semble fonctionner.

C'est ce qui se passait dans mon cas.

100
Vishal Seth

Ajoutez une System.Diagnostics.Debugger.Break(); à Application_Start().
Cela forcera un point d'arrêt.

Cette ligne doit être commentée pour éviter le point d'arrêt à happern et #ifdef debug pour être sûr de ne jamais arriver en production.

23
JotaBe

Je crois que vous devez arrêter/arrêter le serveur de débogage local pour que l'événement Application_Start() se déclenche à nouveau ... vous devriez être en mesure de cliquer dessus avec le bouton droit de la souris dans la barre d'état système et de choisir "Arrêter".

18
John Rasch

Le problème est que Application_Start() déclenche d'abord, puis que le débogueur se connecte.

L’objectif est donc de faire quelque chose qui cause le déclenchement de Application_Start() pendant son fonctionnement. Pour des raisons de débogage, lancez le débogueur comme vous le faites normalement, puis éditez (par exemple, ajoutez une nouvelle ligne) et enregistrez le fichier web.config. 

9
Paul Totzke

La technique ci-dessous a fonctionné pour moi: 
La solution de contournement simple consiste à appuyer sur global.asax après la connexion du débogueur afin de forcer le recyclage d'une application. Ensuite, lors de la prochaine demande, le point d'arrêt défini sur Application_Start sera atteint.

J'ai trouvé ça ici:
http://connect.Microsoft.com/VisualStudio/feedback/details/634919/cannot-debug-application-start-event-in-global-asax

4
Rupesh Kumar Tiwari

Dans mon cas, est-ce que j'utilisais

Serveur Web local IIS dans les paramètres de projet Web

et je passe à Utilise Visual Studio Development Server , et cela fonctionne.

4
Hernaldo Gonzalez

J'ai rencontré le même problème aujourd'hui et utilisais IIS local.

Je crois que cela est dû à la façon dont la page est chargée. Tout ce que vous avez à faire est de placer un point d'arrêt dans Application_Start. Exécutez l'application (dans mon cas, il a fallu à l'écran de connexion), puis allez à web.config. Modifiez-le - en ajoutant des espaces. puis actualiser dans Browser.that atteindra le point d'arrêt sur Application_Start.

4
Dev

Dans mon cas, le problème était entre la chaise et le clavier - après avoir renommé le projet mvc Assembly, j'ai oublié de mettre à jour Global.asax pour qu'il pointe vers la classe correcte. Vérifiez donc les "hérites" dans Global.asax (dans Visual Studio, cliquez avec le bouton droit sur Global.asax -> Afficher le balisage).

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

si elle correspond vraiment à votre déclaration de classe/d'espace de noms Global.asax.cs

3
Ondrej Svejdar

projet -> propriété -> web 

cochez "Code natif".

 enter image description here

0
s.c

Je viens d'avoir ce problème et je suis passé du local IIS à IIS Express dans les propriétés du projet -> Web pour le résoudre.

0
Clarkeye

Peut-être que ma solution aidera quelqu'un: 

  1. Arrêtez le débogueur.
  2. Mettez à jour le code RegisterRoutes (exemple - add\remove int i = 1;).
  3. Reconstruire.
  4. Placez un point de rupture dans RegisterRoutes.
0
Avishay