2009-06-11 5 views
2

J'ai un objet 'context' qui se lie à HttpContext.Items via une propriété Current statique. Cet objet peut être utilisé directement, par le biais de générateurs d'expression et de contrôles, tous faisant partie de la même bibliothèque. Le problème que je rencontre est que je veux disposer de ses ressources gérées (clients WCF) quand une demande se termine sans utiliser un HttpModule (car il n'est pas nécessaire autrement). J'ai implémenté le full disposable pattern (avec Finaliser), mais vous ne pouvez pas compter sur les instances de finalisation du GC en temps opportun.Élimination de données déclaratives par requête sans utiliser de module Http

J'ai essayé de souscrire une méthode statique à HttpApplication.EndRequest (également PostRequestHandlerExecute) dans le constructeur d'objets (avec un verrouillage pour s'assurer qu'elle ne se produit qu'une seule fois), mais l'événement n'est jamais distribué. C'est sans doute parce que l'instance de HttpApplication change, bien que je ne sois pas entièrement sûr.

Avez-vous des idées sur la meilleure façon de résoudre ce problème?

+0

Utilisez-vous WCF avec REST? – andrecarlucci

+0

Non, c'est une requête SOAP. La question était plus générale, cependant. –

Répondre

1

L'inscription de demandes à un événement statique entraînera une fuite de mémoire. Il empêche la demande de générer un garage, car il contient une référence à HttpApplication.

Si vous souhaitez appeler disposer sur un élément mis en cache dans HttpContext.Items, vous devez le faire à la fin de la demande. Si vous ne voulez pas utiliser HttpModule, utilisez Global.ascx et connectez l'événement EndRequest.

void Global_EndRequest(object sender, EventArgs e) 
{ 
    var app = (HttpApplication)sender; 
    var disposableItem = app.Context.Items["disposableItem"] as IDisposable; 
    if (disposableItem != null) 
    { 
     disposableItem.Dispose(); 
    } 
} 
Questions connexes