2008-10-27 6 views
38

Ich schreibe eine App, wo 3rd-Party-Anbieter Plugin-DLLs schreiben und sie in das Bin-Verzeichnis der Web-App fallen lassen können. Ich möchte, dass diese Plugins in der Lage sind, ihre eigenen HttpModule bei Bedarf zu registrieren.Programmatisch registrieren HttpModules zur Laufzeit

Gibt es trotzdem, dass ich HttpModules zur Laufzeit hinzufügen oder aus der Pipeline entfernen kann, ohne einen entsprechenden Eintrag in der Web.Config, oder muss ich die Web.Config beim Hinzufügen/Entfernen von Modulen programmgesteuert bearbeiten? Ich weiß, dass so oder so ein AppDomain-Neustart verursacht wird, aber ich würde es lieber in Code machen, als die web.config zu manipulieren, um denselben Effekt zu erzielen.

Antwort

45

Es hat gerade zur rechten Zeit in dem Httpapplication-Lebenszyklus getan wird was ist, wenn das Httpapplication Objekt initialisiert (mehrmals, einmal für jede Instanz von Httpapplication). Die einzige Methode , wo dies funktioniert, ist HttpApplication Init().

Um ein Modul über Code, den Sie können Ausführen von Code wie folgt statt die Httpmodule Definition in web.config Haken:

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); 
    } 
    } 

Alles, was Sie tun, ist die Httpapplication Init() -Methode außer Kraft setzen und Dann greifen Sie auf die Methode Init der statischen Instanz zu. Init() des Moduls hakt das Ereignis ein und los gehts.

Via Rick Strahl's blog

+0

Eines der Module sind wir etwas zu tun Die Verwendung funktioniert ordnungsgemäß, wenn sie aus web.config referenziert wird, kann aber nicht direkt instanziiert werden (wie in Ihrem Code gezeigt), da sie als Freund deklariert ist. Irgendeine Idee von welchem ​​Kontext sollte ich es instanziieren? – Patonza

26

Erkenne dies eine alte Frage, aber asp.net 4 bietet einige neue capablities, die hier helfen kann.

Insbesondere bietet ASP.NET 4 eine PreApplicationStartMethod-Funktion, die zum programmgesteuerten Hinzufügen von HttpModules verwendet werden kann.

Ich habe gerade einen Blog-Beitrag dazu unter http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx.

Die Grundidee besteht darin, eine abgeleitete HttpApplication zu erstellen, die die Möglichkeit bietet, HttpModules beim Start dynamisch hinzuzufügen, und sie dann in der Pipeline initialisiert, wenn jede HttpApplication-Instanz in der App-Domäne erstellt wird.

+12

Blog dead ... Wayback-Link: http://wayback.archive.org/web/20120719043729/http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx – felickz

12

Die dll Microsoft.Web.Infrastructure.dll hat eine Methode dafür in der Klasse DynamicModuleUtility. Die DLL wird mit WebPages ausgeliefert 1,0

public static class PreApplicationStartCode 
{ 
    private static bool _startWasCalled; 

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

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

In neuen Versionen von ASP MVC Sie Package Manager verwenden, können Sie einen Verweis auf WebActivatorX hinzuzufügen und dann wie diese

using WhateverNameSpacesYouNeed; 

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