2009-12-14 5 views
0

Je développe un composant (HttpModule) utilisé par un certain nombre d'applications Web sur un site Web .NET et je souhaite que le composant soit facilement maintenable. Je suis venu avec quelque chose d'esquissé ci-dessous mais je voulais voir s'il y avait des pensées positives/négatives ou des commentaires généraux sur la mise en œuvre, car je ne suis pas familier avec le chargement de l'Assemblée, surtout en termes de mémoire.Sites Web ASP.NET faisant référence à un assemblage commun et pouvant être mis à jour

(Je ne veux pas vraiment faire ceci: Create Your Own .NET Assembly Cache)

Le HttpModule léger est lui-même dans le GAC et référencé dans le web.config racine du site. A chaque requête, il ouvre un fichier texte (stocké dans la racine/bin du web) qui contient juste un nom d'assembly fort (par exemple "My.MyLibrary, Version = 1.1.0.0, Culture = en, PublicKeyToken = 03689116d3a4ae33") puis vérifie l'AppDomain actuel pour voir s'il est déjà référencé (itère sur GetAssemblies()). Si ce n'est pas le cas, il appelle Assembly.Load pour charger myLibrary et utilise Basic Reflection pour Invoke() une méthode personnalisée dans My.MyLibrary qui effectue le travail de traitement prévu du HttpModule.

My.MyLibrary est également dans le GAC. Pour mettre à jour l'application sans redémarrer l'application, placez une nouvelle version dans le GAC et modifiez simplement la chaîne dans le fichier texte. J'utilise le fichier texte parce que a) c'est rapide et b) je ne voulais pas avoir à mettre à jour une machine/web.config et provoquer un recyclage pour rediriger le HttpModule pour utiliser une nouvelle version de My.MyLibrary. Cela semble fonctionner. L'ancienne version peut être désinstallée du GAC quand elle est enfin prête à l'être. Donc, espérons que la seule réinitialisation d'un pool d'applications serait nécessaire pour changer la partie HttpModule.

Toutes les réponses très appréciées!

-Est

Répondre

0

Personnellement, je dirais que si vous pouvez éviter d'utiliser une liaison tardive, il serait préférable, mais que vous voulez être en mesure d'avoir la liberté de simplement jeter un nouvel ensemble à votre application il ne semble que la liaison tardive a du sens.

En ce qui concerne votre méthode de stockage et de récupération de la liste des assemblages, j'utiliserais un objet XML et le chargerais à partir du fichier. Vous trouverez plus d'informations supplémentaires de cette façon, sinon vous devrez maintenir votre propre format de fichier. Vous pouvez également envisager d'ajouter du code pour intercepter les erreurs générées par ces assemblys, les décharger et placer un drapeau dans votre fichier indiquant à votre HttpModule de ne pas le charger tant qu'il n'a pas été mis à jour.

+0

Merci! Le code finalement exécuté par le HttpModule est assez simple, donc quand j'arriverai à tester/pre-prod je ferai quelques tests et je verrai si la flexibilité vaut la peine que je reçois de la liaison tardive. Oui, j'ai pensé à étendre le fichier texte à un fichier XML, mais je voulais surtout f/back sur l'architecture générale du chargement d'une DLL commmon pour un site web sans avoir besoin d'un redémarrage de l'application. La plupart des articles/messages/commentaires que j'ai trouvés en ligne semblent impliquer que ce n'est pas possible, alors je me demandais s'il y avait d'autres méthodes ou s'il y avait des oublis/problèmes évidents avec la méthode que je prévois d'utiliser. –

+0

Je ne pense pas que je vais décharger l'assembly car je ne veux pas créer de nouveaux AppDomains. Le HttpModule a une gestion des erreurs de couverture. –

+0

D'abord, je dirais que ce n'est pas une bonne pratique d'avoir une architechture où vous ajoutez simplement quelque chose sans un plan solide pour l'enlever quand il est fini, c'est parce qu'à un certain moment dans le futur vous rencontrerez des problèmes de ressources et devrez redémarrez votre application pour au moins libérer de la mémoire. Le chargement dynamique des assemblages est possible dans ASP.Net car vous disposez d'un accès complet au framework .Net. Comment allez-vous utiliser les assemblages que vous chargez? Seront-ils agis comme le HttpModule standard mais sans avoir besoin de redémarrer le domaine de l'application? – Robert

Questions connexes