2008-10-27 9 views
8

Selon this MSDN articleHttpApplication .EndRequest peut être utilisé pour fermer ou disposer des ressources. Cependant, cet événement n'est pas déclenché/appelé dans mon application.ASP.NET HttpApplication.EndRequest événement non déclenché

Nous joignons le gestionnaire de Page_Load de la manière suivante:

HttpContext.Current.ApplicationInstance.EndRequest += ApplicationInstance_EndRequest; 

La seule façon est d'utiliser le gestionnaire Application_EndRequest dans Global.asax, mais ce n'est pas acceptable pour nous.

+0

Si vous fournissez plus d'informations sur les ressources que vous essayez d'éliminer, et comment vous les utilisez, quelqu'un peut vous dire où vous devriez faire cela. – Will

Répondre

14

Vous pouvez utiliser votre propre HttpModule pour capturer l'EndRequest si vous ne voulez pas utiliser global.asax.

public class CustomModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += new EventHandler(context_EndRequest); 
    } 

    private void context_EndRequest(object sender, EventArgs e) 
    { 
     HttpContext context = ((HttpApplication)sender).Context; 
     // use your contect here 
    } 
} 

Vous devez ajouter le module à votre web.config

<httpModules> 
    <add name="CustomModule" type="CustomModule"/> 
</httpModules> 
+1

Pourquoi est-ce le cas? Pourquoi l'événement ne se déclenche-t-il pas sans être dans un httpmodule? – mcintyre321

+0

Lire Mitchel Sellers répondre, c'est pourquoi. Le plus simple serait d'utiliser global.asax, mais si vous ne pouvez pas l'utiliser, vous pouvez vous abonner à votre propre module pour attraper la requête. –

1

La page est probablement mise au rebut avant le déclenchement de l'événement. Vous pouvez essayer d'effectuer votre travail dans le gestionnaire Page_Unload.

+0

Nous en avons besoin au niveau de la demande. Nous avons déjà une solution de contournement pour cela, mais en fait, il ne fonctionne pas comme il se doit selon la documentation MSDN: L'événement EndRequest est toujours déclenché lorsque la méthode CompleteRequest est appelée. – Crank

5

Par la documentation MSDN, cet événement se produit APRÈS la fin de la page, tout comme BeginRequest. Donc pour autant que je sache, il n'est pas possible d'attraper ceci au niveau de la page

+0

Une pensée qu'il peut être difficile pour le débogueur d'attraper cet événement. Mais j'ai ajouté du code qui n'a pas été appelé (j'en suis sûr). – Crank

2

Je crois une meilleure façon de cet événement est la chaîne en fournissant une classe de base à Global.asax

Language="C#" Inherits="YourBaseClass" 

puis en remplaçant Init():

public override void Init() 
{ 
    base.Init(); 

    BeginRequest += new EventHandler(OnBeginRequest); 
    EndRequest += new EventHandler(OnEndRequest); 
} 

semble fonctionner pour moi (attraper un point d'arrêt), mais je fais vraiment quelque chose avec ça.

Puisqu'il existe plusieurs instances HttpApplication, le définir dans Page_load peut continuer à l'ajouter à une instance non spécifique. Bizarrement, j'ai aussi remarqué que HttpApplication.Init() n'est pas appelé pour la toute première instance HttpApplication (mais Application_start).

Questions connexes