2009-04-20 13 views
76

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 en C#/ASP.NET.IHttpHandler vs IHttpModule

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 aussi à 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)?

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

+2

sérieusement à LOL'ed « Il me vient que je ne comprends pas les différences entre les deux. » Bonne question mais ça mériterait un +1 seulement pour ça :) – JohnIdol

+2

:-) Merci. Je trouve que c'est bon d'être honnête avec ce que je ne connais pas. –

+1

Sans questions, il n'y aurait pas de réponses ..:) – Sprintstar

Répondre

65

Un ASP.NET gestionnaire HTTP est le processus (souvent appelé le « point final ») qui fonctionne en réponse à une demande faite à un ASP Application Web .NET Le gestionnaire le plus courant est un gestionnaire de page 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 page. Vous pouvez créer vos propres gestionnaires HTTP qui affichent des résultats personnalisés dans le navigateur.

utilisations typiques pour les gestionnaires HTTP personnalisés sont les suivants:

  • flux RSS Pour créer un flux RSS pour un site Web, vous pouvez créer un gestionnaire qui émet XML RSS formaté. Vous pouvez ensuite lier une extension de nom de fichier telle que .rss au gestionnaire personnalisé. Lorsque les utilisateurs envoient une requête à 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 ensemble qui est appelé à chaque demande qui est faite à votre demande. 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.

utilisations typiques des modules HTTP sont les suivants:

  • Sécurité Parce que vous pouvez examiner les requêtes entrantes, un module HTTP peut effectuer une authentification personnalisée ou d'autres contrôles de sécurité avant que la page demandée, service Web XML ou gestionnaire est appelé. Dans Internet Information Services (IIS) 7.0 exécuté en mode intégré, vous pouvez étendre l'authentification par formulaires à tous les types de contenu dans une application.
  • Statistiques et journalisation Comme les modules HTTP sont appelés à chaque requête, vous pouvez recueillir des statistiques de demande et consigner des informations 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é, dans chaque page ou dans la réponse du service Web XML.

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

16

Comme indiqué here, HttpModules sont des classes simples qui peuvent se brancher sur le pipeline de traitement des demandes, alors que HttpHandlers diffèrent de HttpModules non seulement en raison de leurs positions dans le pipeline de traitement des demandes, mais aussi parce qu'ils doivent être mis en correspondance avec un spécifique extensions de fichiers.

+0

vous n'avez pas besoin de mapper un gestionnaire à une extension si dans un HttpModule vous résolvez explicitement à une classe qui implémente iHttpHandler – rizzle

+0

@rizzle: que voulez-vous dire "résoudre explicitement à une classe qui implémente IHttpHandler"? Voulez-vous dire le IHttpModule est aussi un IHttpHandler? –

+3

@Ryan: Dans le module, vous pouvez attacher une méthode à l'événement HttpApplication.BeginRequest et lui donner le gestionnaire que vous choisissez, indépendamment de l'extension de fichier – rizzle

13

IHttpModule vous donne beaucoup plus de contrôle, vous pouvez contrôler essentiellement tous 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, alors 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 utilisez 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 à la foisIHttpHandler et IHttpModule, puis décidez de l'utilisation à définir dans Web.config.

+0

Merci de nous expliquer un peu pour dire que nous ajoutons une authentification personnalisée à un serveur web pour dire des demandes à distance, mais ne pas utiliser cela pour les locaux? – fayyazkl

5

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. En revanche, les gestionnaires n'ont pas la possibilité de s'abonner à des événements d'application et, au lieu de cela, ils appellent simplement leur méthode ProcessRequest pour exécuter le travail "principal" de traitement d'une requête spécifique.

Jetez un oeil à la documentation de Microsoft (à mi-chemin en bas de la page dans la « La demande est traitée par le pipeline HttpApplication » section):

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

Vous pouvez voir à l'étape 15 où le gestionnaire a sa chance d'exécuter. Tous les événements avant et après cette étape sont disponibles pour l'interception par les modules, mais pas les gestionnaires. En fonction des fonctionnalités spécifiques que vous essayez d'atteindre, 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.

Il peut être utile d'utiliser un gestionnaire de chargement déjà écrit.

est ici une source libre et ouvert un:

http://www.brettle.com/neatupload

est ici un commercial:

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

Si vous regardez la documentation NeatUpload, vous verrez que vous oblige à configurer un module.

5

15 secondes a une belle petite tutorial donnant exemple pratique

+2

Cet article peut maintenant être trouvé sur codeguru: http://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm – mhu