2008-10-05 6 views
0

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 vois pas comment accéder à l'état de l'application sans la passer (ou plutôt la connexion à la 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 courant, et je ne trouve aucune autre méthode statique pour accéder à l'état.Accès à HttpApplicationState au cours de Session_End

Ai-je raté quelque chose?

MISE À JOUR: Il semble que ma question nécessite des éclaircissements supplémentaires, alors laissez-moi essayer l'exemple de code suivant. Ce que je veux être en mesure de le faire est:

// in 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 en a besoin à transformer les informations qui sont stockées dans l'état d'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 ... comme paramètre à la méthode de nettoyage" ci-dessus.

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

Je n'aime pas l'idée que Global.asaxa de savoir où l'objet NeedsCleanup obtient ses informations. Ce genre de chose qui a plus de sens comme autonome dans la classe.

Répondre

0

Où êtes-vous en train de créer 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 souhaitez dissocier le nettoyage de NeedsCleanup de son appelant. Peut-être un moyen plus simple serait de passer dans l'instance "HttpApplication" trouvée à la fois sur "HttpContext.Current.ApplicationInstance" ainsi que de votre classe Global via la référence "this". Alternativement, vous pouvez spécifier n'importe lequel des exemples ci-dessus sur la construction, ce qui rendrait le nettoyage moins couplé.

+0

Après plus de réflexion, j'ai décidé que vous avez frappé le problème avec cette réponse. Ce n'est pas que ma question n'a pas de solution (évidente), mais que j'essaie de résoudre le mauvais problème. Puisque "NeedsCleanup" est créé quand I * peut * obtenir l'état de l'application, il doit mettre en cache l'état dans son ctor.Bien découplé. – DocMax

1

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

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

Cette propriété et beaucoup plus viennent de la classe de base de Global.asax

+0

La propriété Session est l'endroit où je reçois l'objet qui effectue le nettoyage. C'est l'objet appelé qui a besoin d'accéder à l'état _application_. Et c'est là que se situe le problème. – DocMax

3

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

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

(dû répondre dans une réponse différente parce que je ne l'ai pas la réputation nécessaire pour commenter directement)

+0

Cela devrait vous permettre d'obtenir l'objet d'application correctement – Tom

+0

@Greg, vous auriez pu modifier votre réponse originale. Peu importe, maintenant que vous avez beaucoup de rep, vous devriez nettoyer les dupes. – KyleMit

+0

lol @KyleMit 8 ans plus tard, merci pour le conseil –

Questions connexes