web-dev-qa-db-fra.com

IHttpHandler vs IHttpModule

Ma question est simple (bien que la réponse ne sera probablement pas): j'essaie de décider comment implémenter un gestionnaire de téléchargement côté serveur dans C #/ASP.NET.

J'ai utilisé à la fois HttpModules (interface IHttpModule) et HttpHandlers (interface IHttpHandler) et il me semble que je pourrais implémenter cela en utilisant l'un ou l'autre mécanisme. Il me vient également à l'esprit que je ne comprends pas les différences entre les deux.

Donc ma question est la suivante: Dans quels cas choisirais-je d'utiliser IHttpHandler au lieu de IHttpModule (et vice-versa)?

L'un est-il exécuté beaucoup plus haut dans le pipeline? Est-il beaucoup plus facile à configurer dans certaines situations? Ne fonctionne-t-on pas bien avec une sécurité moyenne?

79
Dan Esparza

Un gestionnaire HTTP ASP.NET est le processus (souvent appelé "point de terminaison") qui s'exécute en réponse à une demande adressée à ASP.NET Application Web. Le gestionnaire le plus courant est un gestionnaire de pages ASP.NET qui traite les fichiers .aspx. Lorsque les utilisateurs demandent un fichier .aspx, la demande est traitée par la page via le gestionnaire de pages. Vous pouvez créer vos propres gestionnaires HTTP qui rendent la sortie personnalisée au navigateur.

Les utilisations typiques des gestionnaires HTTP personnalisés sont les suivantes:

  • Flux RSS Pour créer un flux RSS pour un site Web, vous pouvez créer un gestionnaire qui émet du XML au format RSS. Vous pouvez ensuite lier une extension de nom de fichier telle que .rss au gestionnaire personnalisé. Lorsque les utilisateurs envoient une demande à votre site qui se termine par .rss, ASP.NET appelle votre gestionnaire pour traiter la demande.
  • Serveur d'images Si vous souhaitez qu'une application Web diffuse des images de différentes tailles, vous pouvez écrire un gestionnaire personnalisé pour redimensionner les images, puis les envoyer à l'utilisateur en tant que réponse du gestionnaire.

Un module HTTP est un assembly appelé à chaque demande adressée à votre application. Les modules HTTP sont appelés dans le cadre du pipeline de demandes ASP.NET et ont accès aux événements du cycle de vie tout au long de la demande. Les modules HTTP vous permettent d'examiner les demandes entrantes et sortantes et de prendre des mesures en fonction de la demande.

Les utilisations typiques des modules HTTP sont les suivantes:

  • Sécurité Parce que vous pouvez examiner les demandes entrantes, un module HTTP peut effectuer une authentification personnalisée ou d'autres vérifications de sécurité avant l'appel de la page, du service Web XML ou du gestionnaire demandé. Dans Internet Information Services (IIS) 7.0 exécuté en mode intégré, vous pouvez étendre l'authentification par formulaire à tous les types de contenu d'une application.
  • Statistiques et journalisation Étant donné que les modules HTTP sont appelés à chaque demande, vous pouvez rassembler des statistiques de demande et des informations de journal dans un module centralisé, plutôt que dans des pages individuelles.
  • En-têtes ou pieds de page personnalisés Étant donné que vous pouvez modifier la réponse sortante, vous pouvez insérer du contenu tel que des informations d'en-tête personnalisées dans chaque page ou réponse de service Web XML.

De: http://msdn.Microsoft.com/en-us/library/bb398986.aspx

69
Ramani Sandeep

Comme indiqué ici , les HttpModules sont des classes simples qui peuvent se connecter au pipeline de traitement des demandes, tandis que les HttpHandlers diffèrent des HttpModules non seulement en raison de leur position dans le pipeline de traitement des demandes, mais aussi parce qu'ils doivent être mappés sur une extension de fichier spécifique.

16
Kirtan

IHttpModule vous donne beaucoup plus de contrôle, vous pouvez essentiellement contrôler tout du trafic dirigé vers votre application Web. IHttpHandler vous donne moins de contrôle (le trafic est filtré avant il atteint votre gestionnaire), mais si cela est suffisant pour vos besoins, je ne vois aucune raison d'utiliser le IHttpModule.

Quoi qu'il en soit, il est probablement préférable d'avoir votre logique personnalisée dans une classe distincte, puis d'utiliser simplement cette classe à partir de IHttpModule ou IHttpHandler. De cette façon, vous n'avez pas vraiment à vous soucier de choisir l'un ou l'autre. En fait, vous pouvez créer une classe supplémentaire qui implémente les deuxIHttpHandler et IHttpModule, puis décider quoi utiliser en la définissant dans Web.config.

15
Igor Brejc

15 secondes a un joli petit tutoriel donnant un exemple pratique

5
Yordan Georgiev

Les modules sont destinés à gérer les événements déclenchés par l'application avant et après le traitement effectif de la demande par le gestionnaire. Les gestionnaires, d'autre part, n'ont pas la possibilité de s'abonner à des événements d'application et, au lieu de cela, obtiennent simplement leur méthode ProcessRequest invoquée pour le travail "principal" de traitement d'une demande spécifique.

Jetez un œil à cette documentation de Microsoft (à mi-chemin de la page dans la section "La demande est traitée par le pipeline HttpApplication"):

http://msdn.Microsoft.com/en-us/library/bb470252.aspx

Vous pouvez voir à l'étape 15 où le gestionnaire a sa chance de s'exécuter. Tous les événements avant et après cette étape sont disponibles pour l'interception par les modules, mais pas les gestionnaires.

Selon les fonctionnalités spécifiques que vous essayez d'obtenir, vous pouvez utiliser un gestionnaire ou un module pour implémenter un gestionnaire de téléchargement. Vous pourriez même finir par utiliser les deux.

Quelque chose à considérer pourrait utiliser un gestionnaire de téléchargement déjà écrit.

En voici une gratuite et open source:

http://www.brettle.com/neatupload

En voici une commerciale:

http://krystalware.com/Products/SlickUpload/

Si vous regardez la documentation de NeatUpload, vous verrez qu'elle vous oblige à configurer un module.

5
Jason Diamond