web-dev-qa-db-fra.com

Différence entre Application_Start et Application_OnStart

Je suis en train d'ajouter du code ASP.NET MVC à un projet Webforms ASP.NET préexistant. Les divers tutoriels suggèrent d'ajouter le routage à une méthode appelée depuis Application_Start () dans Global.asax. Mon Global.asax a déjà une méthode Application_OnStart (Object, EventArgs) avec du code d'installation.

Si j'essaie d'avoir à la fois Start et OnStart, l'OnStart n'est pas appelé (et la configuration échoue, provoquant des erreurs). Il semble que je doive choisir l'un ou l'autre.

Ma question est: laquelle dois-je utiliser? Quelle est la différence entre eux? Sont-ils appelés à des moments différents?

(Remarque: au moment d'écrire ces lignes, les hits topthreeGoogle sont inutiles et/ou trompeurs. J'espère que Stack Overflow peut répare ça.)

37
Craig Walker

Dans ASP classique (hérité), il existe une poignée de noms de fonctions spéciales qui, si elles sont définies dans votre fichier global.asa, seront exécutées à des points spécifiés au cours du cycle de vie de l'application. Ceux-ci sont définis comme:

  • Application_OnStart - s'exécute une fois, lorsque votre application reçoit la première demande HTTP et immédiatement avant le traitement des fichiers .ASP.
  • Application_OnEnd - s'exécute une fois, lors de l'arrêt de l'application, une fois toutes les demandes traitées.
  • Session_OnStart - s'exécute au début de chaque session utilisateur unique. Si un utilisateur/client a désactivé les cookies, cela s'exécute pour chaque demande car ASP ne détecte jamais le cookie de session identifiant une session existante.
  • Session_OnEnd théoriquement!) S'exécute chaque fois qu'une session utilisateur expire. Bonne chance avec ça.

Ceux-ci sont fondamentalement câblés dans le runtime classique ASP - vous ne pouvez pas les modifier et vous ne pouvez pas attacher d'autres méthodes à ces événements.

Dans ASP.NET, il existe une chose appelée AutoEventWireup qui utilise la réflexion pour trouver des méthodes conformes à des conventions de dénomination particulières et exécute ces méthodes en réponse aux événements de correspondance déclenchés par le runtime ASP.NET. L'exemple le plus courant est la méthode Page_Load, Qui est automatiquement invoquée en réponse à la classe Page déclenchant l'événement Load pendant le cycle de vie de la page.

La même technique est utilisée pour attacher des gestionnaires aux événements de cycle de vie au niveau de l'application. Il recherchera les méthodes nommées ModuleName_EventName ou ModuleName_OnEventName, ne prenant aucun paramètre () Ou (object sender, EventArgs e)

Voici la partie amusante - --- (si vous définissez plusieurs méthodes de correspondance, seule celle qui apparaît en dernier dans le fichier s'exécutera. (La dernière méthode gagne, essentiellement)

Donc, si votre global.asax.cs ressemble à ceci:

public class Global : System.Web.HttpApplication {
    protected void Application_Start() {
        Debug.WriteLine("A: Application_Start()");
    }

    protected void Application_Start(object sender, EventArgs e) {
        Debug.WriteLine("B: Application_Start(object sender, EventArgs e)");
    }

    protected void Application_OnStart() {
        Debug.WriteLine("C: Application_OnStart()");

    }
    protected void Application_OnStart(object sender, EventArgs e) {
        Debug.WriteLine("D: Application_OnStart(object sender, EventArgs e)");
    }
}

vous verrez le message D dans votre sortie de débogage; si vous commentez la dernière méthode de ce bloc, vous verrez le message C à la place.

Donc, utilisez la convention de dénomination que vous souhaitez, mais si vous en définissez plusieurs, seule celle qui apparaît en dernier dans votre fichier source sera exécutée. Je resterais personnellement avec Application_Start(object sender, EventArgs e) puisque c'est la signature générée par les modèles de projet Visual Studio et la plupart des outils de conception/codage .NET.

75
Dylan Beattie

Selon Microsoft docs sur le cycle de vie de l'application ASP.Net vous devez utiliser la méthode Application_start dans le fichier global.asax:

Application_Start: appelé lorsque la première ressource (telle qu'une page) dans une application ASP.NET est demandée. La méthode Application_Start n'est appelée qu'une seule fois pendant le cycle de vie d'une application. Vous pouvez utiliser cette méthode pour effectuer des tâches de démarrage telles que le chargement de données dans le cache et l'initialisation de valeurs statiques.

Application_OnStart: l'événement Application_OnStart se produit avant la création de la première nouvelle session (lorsque l'objet Application est référencé pour la première fois). Cela va dans Global.asa , pas global.asax.

10
Parrots

Application_OnStart :

La fonction Application_OnStart est appelée avant que tous les fichiers .asp ne soient traités - avant que tout texte ou graphique soit rendu et envoyé au navigateur de l'utilisateur. Dans cette fonction, l'appel suivant à la méthode CreateObject sur l'objet Active Server Pages Server crée l'objet CDO Rendering Library RenderingApplication. Si cet appel réussit, la variable objRenderApp contient un pointeur sur le nouvel objet.

Toutes les références que j'ai pu trouver se réfèrent aux pages .asp

Application_Start

Les méthodes Application_Start et Application_End sont des méthodes spéciales qui ne représentent pas les événements HttpApplication. ASP.NET les appelle une fois pour la durée de vie du domaine d'application, pas pour chaque instance HttpApplication.

Cette page fait référence aux pages .aspx. Donc, comme vous utilisez MVC et mentionnez global.asax, c'est celui que vous devez utiliser.

5
ChrisF