2009-03-22 9 views
9

Dans une petite application de démonstration que je construis, je mets du code pour initialiser la base de données dans l'événement Global.Session_Start(). Cependant, je remarque que cet événement ne se déclenche pas lorsque je parcours l'application dans le débogueur sur le serveur de développement (je ne l'ai pas encore testé ailleurs).Qu'est-ce qui provoque l'appel de Session_Start?

Question 1: Ce qui donne? Quand Session_Start() est-elle appelée? Je suppose que c'est quand la session commence mais ne devrait pas le début de chaque nouvelle séquence de demandes provoquer une session pour démarrer automatiquement? Certes, une session devrait commencer chaque fois que je cours avec F5 alors pourquoi pas.

Question 2: Y a-t-il un meilleur endroit où le code pour initialiser la base de données devrait aller? Je préfère ne pas le mettre dans la méthode Application_Start, car il n'est pas toujours appelé lors du débogage.

PS. En initialisant la base de données je ne veux pas dire que j'ouvre une connexion à SqlServer et la laisse ouverte pour toujours. J'utilise db4o et j'ouvre un fichier de base de données pré-construit. Comme je l'ai dit, ce n'est qu'une application de démonstration, je ne m'inquiète pas de la mauvaise gestion des ressources ou de quoi que ce soit de ce genre.

+0

Pourriez-vous élaborer sur "l'initialisation de la base de données"? – HardCode

+0

Elaboré. Je dis essentiellement à Db4o d'utiliser un fichier particulier pour dessiner des données –

+0

Poste double accidentel. Supprimé l'autre, celui-ci a plus d'infos. –

Répondre

3

Je ne suis pas entièrement sûr qu'une session "démarre" jusqu'à ce que vous accédiez à l'objet Session. Sinon, il semblerait que les frais généraux inutiles pour déclencher une session inutile.

+0

Hmm..ok. Peut-être que cela aurait du sens de mettre le code dans BeginRequest() mais est-il un moyen de mettre un gestionnaire à EndRequest() à laquelle je peux fermer le fichier de base de données? –

+0

Je ne suis peut-être pas tout à fait d'accord sur ce point ... sur une chose que j'ai vue en ligne, c'est peut-être un problème de configuration d'asp.net qui peut être résolu par "aspnet_regiis.exe -i". J'essaierais d'abord! – Keltex

1

Quel modèle de session utilisez-vous? Dans le cas de sessions sauvegardées SQL Server, il ne peut pas démarrer une nouvelle session. Dans le cas d'InProc, je pense que ça devrait marcher. Application_Start a le problème d'être parfois déclenché avant que le débogueur puisse se connecter, comme vous l'avez souligné.

Utilisez-vous IIS ou le serveur Web de développement? Dans le cas d'IIS, this article suggère que vous devez d'abord le créer en tant qu'application.

+0

C'est le serveur web de développement. Comme je l'ai dit plus haut, je ne m'inquiète pas de la bonne gestion de session de base de données. Ceci est une application de démonstration et j'utilise Db4o de toute façon. Je veux juste m'assurer qu'il s'ouvre avant que quelqu'un ne l'utilise. –

+0

J'ai ajouté à mon web.config. Session_Start() ne déclenche toujours pas –

2

Hmm..ok. Peut-être que cela aurait du sens mettre le code dans BeginRequest() mais il ya un moyen de mettre un gestionnaire à EndRequest() à laquelle je peux fermer le fichier de base de données ?

Le problème est que vous ne pouvez jamais compter sur ces événements au feu, parce que le runtime ASP.NET décide si elles sont tirées ou non, car ils pourraient même ne pas être nécessaire et peut être sautée pour économiser les ressources. Par exemple, un Response.Redirect annule tout le traitement d'une requête en utilisant une exception ThreadAbortException, et les événements du cycle de vie de la page/du contrôle ne sont pas déclenchés du tout, c'est pourquoi par exemple il n'y a pas End_Request ou similaire .

Je considérerais déplacer votre logique à une couche différente (indépendante d'ASP.NET), et peut-être initialiser la base de données quand elle est réellement demandée d'une page? Ensuite, vous pouvez fermer le fichier de base de données dans la même méthode que vous aviez besoin de l'information, cela vous rendrait beaucoup plus indépendant de l'état de l'application/session.

Vous ne savez pas si c'est l'information que vous cherchiez :)

+0

Oui, c'est une recommandation utile. Qu'en est-il de la Question 1. Quand dans le monde est-ce que session_start est censé tirer? –

+0

Salut George, Je ne suis pas sûr, mais je suppose que "Keltex" est dans la bonne direction, et il est déclenché lorsque vous accédez (écrire?) À la session depuis l'extérieur du gestionnaire Session_Start (quelque part dans une méthode Page_Load par exemple). –

6

Je sais que c'est un ancien poste, mais peut-être cela aidera quelqu'un:

le session_start ne se déclenche pas à moins que vous lisez en fait ou en écrivant à l'objet de la session.

Si vous voulez utiliser l'événement session_start mais ne pas besoin d'utiliser le magasin de session à tous, vous pouvez ajouter ce qui suit à la directive de page de vos pages de destination:

<%@ Page EnableSessionState="ReadOnly" %> 

Cela entraînera la L'événement session_start se déclenche sans que vous ayez à stocker quoi que ce soit dans l'objet session.

Questions connexes