À quoi sert IHttpHandler.IsReusable?

105

J'écris un IHttpHandleret je vais devoir implémenter une IsReusablepropriété. Quand je regarde la documentation MSDN, il dit:

Obtient une valeur indiquant si une autre demande peut utiliser l'instance IHttpHandler.

Ce n'est pas très utile. Dans quelles situations dois-je utiliser un gestionnaire réutilisable et dans quelles situations ne doit-il pas être réutilisable?

Questions de suivi:

  1. Qu'est-ce que la réutilisation?
  2. Puis-je maintenir l'état (c'est-à-dire les variables de classe) quand Reusable = true??
Kees C. Bakker
la source
"Réutiliser" signifie gérer plus d'une demande avec une instance particulière du gestionnaire. Vous pouvez stocker n'importe quoi dans Session - cela ne sera pas affecté lorsque l'instance du gestionnaire sera publiée.
IrishChieftain
@IrishChieftain C'est comme si .Net garde un sac de HttpHandlers instanciés, en choisit un et lui donne juste un contexte?
Kees C. Bakker
1
@IrishChieftain en ce moment, je l'utilise pour un simple streamer de certaines informations de journal. Mais j'essaie d'apprendre quelles sont les implications pour comprendre quand et comment utiliser IHttpHandlers. Ils sont une caractéristique oubliée par beaucoup.
Kees C. Bakker

Réponses:

94

Cette propriété indique si plusieurs demandes peuvent être traitées avec la même instance IHttpHandler. Par défaut, à la fin d'un pipeline de demandes, tous les gestionnaires http qui sont placés dans le handlerRecycleList de HttpApplication sont définis sur null. Si un gestionnaire est réutilisable, il ne sera pas défini sur null et l'instance sera réutilisée dans la prochaine requête.

Le principal gain est la performance car il y aura moins d'objets à ramasser.
Le problème le plus important pour le gestionnaire réutilisable est qu'il doit être thread-safe. Ce n'est pas anodin et nécessite quelques efforts.

Je vous suggère personnellement de laisser la valeur par défaut (non réutilisable) si vous n'utilisez que des ressources gérées car le garbage collector devrait facilement les gérer. Le gain de performances des gestionnaires réutilisables est généralement négligeable par rapport au risque d'introduire des bogues de thread difficiles à trouver.

Si vous décidez de réutiliser le gestionnaire, vous devez éviter de conserver l'état dans les variables de classe, car si l'instance de gestionnaire est accédée simultanément, plusieurs requêtes écriront / liront les valeurs.

Branislav Abadjimarinov
la source
1
Votre dernière recommandation pour éviter de maintenir l'état dans les variables de classe est légèrement déroutante. En supposant que vous définissiez IsReusable sur false, alors n'y aurait-il aucune possibilité qu'une autre requête (simultanée ou non) accède à la même instance de ce HttpHandler, et donc maintenir l'état dans les variables de classe serait sûr?
Ben Amada
2
Sûr. J'ai reformulé la dernière recommandation en soulignant qu'elle n'est applicable que si le IHttpHandler est réutilisé. Merci pour la clarification, Ben!
Branislav Abadjimarinov
7
Pour ce que ça vaut, j'ai implémenté beaucoup, beaucoup IHttpHandleravec IsReusableset to trueet je n'ai eu aucun problème. La chose principale à garder à l'esprit est de ne pas avoir de variables étendues à la classe, mais plutôt d'utiliser des variables locales dans vos fonctions.
dana
6
Excellente explication. Clair et précis. Je souhaite que les articles MSDN soient aussi concis.
AlexVPerl
1
@Branislav - Si je comprends bien votre réponse. Il est non seulement possible pour différents threads d'utiliser simultanément différentes instances du gestionnaire, mais est également possible pour différents threads d'exécuter la même instance du gestionnaire simultanément?
Ian
11

Apparemment, cela garde le gestionnaire en mémoire et est capable de gérer plusieurs requêtes. Lorsqu'il est défini sur false, il doit créer une nouvelle instance du gestionnaire pour chaque requête entrante.

Voici une question qui montre ce qui se passe lorsqu'il n'est pas utilisé correctement:

Diffusion d'images à base de données à l'aide de HttpHandler

Irlandais
la source
Avez-vous de la documentation à l'appui de votre réponse?
Kees C. Bakker
4
Comme vous, je n'ai pas trouvé de documentation satisfaisante sur MSDN, j'ai donc dû tester le chargement d'images d'une base de données vers une page d'un site de commerce électronique, puis observer ce qui s'est passé :)
IrishChieftain
5

Il est moins coûteux de recycler le gestionnaire que d'en créer un nouveau à chaque fois qu'une requête arrive et le serveur consomme moins de mémoire, ce qui facilite le travail que GC doit effectuer. Si le gestionnaire est dans un état où le traitement d'une nouvelle requête ne serait pas problématique (c'est-à-dire que tout état de l'instance du gestionnaire a été réinitialisé) , alors il devrait être considéré comme réutilisable.

ÉDITER

Je ne sais pas si ma réponse définit correctement ce qu'est la réutilisation. Il permet en fait une réutilisation simultanée, donc il vaut mieux éviter efficacement l'état ou le gérer soigneusement de manière thread-safe.

dépensier
la source
Je le penserais aussi. Vous avez raison, la question (fondamentale) réelle est: «qu'est-ce que la réutilisation?
Kees C. Bakker