0 votes

Accéder à HttpApplicationState lors de Session_End

Dans mon application ASP.NET utilisant des sessions InProc, Session_End appelle une méthode statique dans un autre objet pour effectuer un nettoyage spécifique à la session. Ce nettoyage utilise une connexion de base de données partagée que je stocke dans l'état de l'application.

Le problème est que je ne sais pas comment accéder à l'état de l'application sans le passer (ou plutôt la connexion de base de données) en tant que paramètre à la méthode de nettoyage. Comme je ne suis pas dans une requête, je n'ai pas de HttpContext actuel, et je ne trouve aucune autre méthode statique pour accéder à l'état.

Est-ce que j'ai raté quelque chose ?

MISE À JOUR : Il semble que ma question nécessite des éclaircissements supplémentaires, alors permettez-moi d'essayer l'exemple de code suivant. Ce que je veux pouvoir faire est :

// dans Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp();
}

Mais le problème est que la méthode CleanUp a besoin à son tour d'informations qui sont stockées dans l'état de l'application. Je fais déjà ce qui suit, mais c'est exactement ce que j'espérais éviter ; c'est ce que je voulais dire par "...sans le passer... en tant que paramètre à la méthode de nettoyage" ci-dessus.

// dans Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp(this.Application);
}

Je n'aime tout simplement pas l'idée que Global.asax doive savoir d'où l'objet NeedsCleanup obtient ses informations. Cela a plus de sens en tant qu'entité autonome au sein de la classe.

3voto

Greg Dean Points 12048

Vous devriez pouvoir accéder à l'objet ApplicationState en utilisant la propriété Application à l'intérieur de Session_End.

void Session_End(object sender, EventArgs e) 
{
     HttpApplicationState state = this.Application;
}

(j'ai dû répondre dans une réponse différente car je n'ai pas la réputation nécessaire pour commenter directement)

1voto

Greg Dean Points 12048

Vous devriez pouvoir accéder à l'objet SessionState en utilisant la propriété Session à partir de Session_End.

void Session_End(object sender, EventArgs e) 
{
    HttpSessionState session = this.Session;
}

Cette propriété et bien d'autres proviennent de la classe de base de Global.asax

0voto

Greg Dean Points 12048

Où créez-vous les instances "NeedsCleanup"? Si c'est dans Session_Start, il est logique que votre classe globale sache comment/quand créer et détruire ces instances.

Je comprends que vous aimeriez découpler le nettoyage de NeedsCleanup de son appelant. Peut-être qu'une façon plus propre serait de passer l'instance "HttpApplication" trouvée à la fois sur "HttpContext.Current.ApplicationInstance" ainsi que depuis votre classe Globale via la référence "this". Alternativement, vous pourriez spécifier l'une des instances mentionnées lors de la construction également, ce qui rendrait le nettoyage moins couplé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X