2008-10-27 8 views
38

J'écris une application où les fournisseurs tiers peuvent écrire des plug-ins DLL et les déposer dans le répertoire bin de l'application web. Je veux que la capacité de ces plugins soit capable d'enregistrer leurs propres HttpModules si nécessaire. Y at-il un moyen pour ajouter ou supprimer des modules HttpModules depuis et vers le pipeline au moment de l'exécution sans avoir d'entrée correspondante dans Web.Config ou dois-je modifier par programme le fichier Web.Config lors de l'ajout/suppression de modules? Je sais que l'une ou l'autre façon va provoquer un redémarrage de AppDomain mais je préfère être capable de le faire dans le code plutôt que de devoir fudge le web.config pour obtenir le même effet.Enregistrer par programme HttpModules à l'exécution

Répondre

45

Il doit être fait à tout moment en plein cycle de vie HttpApplication qui est lorsque l'objet HttpApplication (Initialise plusieurs fois, une fois pour chaque instance de HttpApplication). La seule méthode où cela fonctionne est HttpApplication Init().

raccorder un module via le code, vous pouvez exécuter du code comme le suivant au lieu de la définition HttpModule dans web.config:

public class Global : System.Web.HttpApplication 
    { 
    // some modules use explicit interface implementation 
    // by declaring this static member as the IHttpModule interface 
    // we work around that 
    public static IHttpModule Module = new xrnsToashxMappingModule(); 
    public override void Init() 
    { 
     base.Init(); 
     Module.Init(this); 
    } 
    } 

Tout ce que vous faites est passer outre la méthode Init() du HttpApplication et puis accédez à la méthode Init de l'instance statique. Init() du module connecte l'événement et c'est parti.

Via Rick Strahl's blog

+0

L'un des modules, nous sommes using fonctionne correctement lorsqu'il est référencé à partir de web.config, mais ne peut pas être instancié directement (comme indiqué dans votre code) car il est déclaré ami. Une idée de quel contexte devrais-je l'instancier? – Patonza

26

réalise que c'est une question ancienne, mais asp.net 4 fournit quelques nouvelles capablities qui peuvent aider ici. En particulier, ASP.NET 4 fournit une fonctionnalité PreApplicationStartMethod qui peut être utilisée pour ajouter des modules HttpModules par programme.

Je viens de publier un article sur ce sujet au http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx. L'idée de base est de créer une HttpApplication dérivée qui permet d'ajouter des HttpModules dynamiquement au démarrage, puis de les initialiser dans le pipeline chaque fois qu'une instance HttpApplication est créée dans le domaine de l'application.

+12

Blog mort ... lien de retour: http://wayback.archive.org/web/20120719043729/http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx – felickz

12

Le DLL Microsoft.Web.Infrastructure.dll a une méthode pour cela dans la classe DynamicModuleUtility. Le dll est livré avec WebPages 1,0

public static class PreApplicationStartCode 
{ 
    private static bool _startWasCalled; 

    public static void Start() 
    { 
     if (_startWasCalled) return; 

     _startWasCalled = true; 
     DynamicModuleUtility.RegisterModule(typeof(EventTriggeringHttpModule)); 
    } 
} 
0

Dans les nouvelles versions de ASP MVC, vous pouvez utiliser Package Manager pour ajouter une référence à WebActivatorX puis faire quelque chose comme ça

using WhateverNameSpacesYouNeed; 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(YourApp.SomeNameSpace.YourClass), "Initialize")] 
namespace YourApp.SomeNameSpace 
{ 
    public static void Initialize() 
    { 
    DynamicModuleUtility.RegisterModule(... the type that implements IHttpModule ...); 
    } 
} 
Questions connexes