Registrazione programmatica di HttpModules in fase di esecuzione
-
04-07-2019 - |
Domanda
Sto scrivendo un'app in cui i fornitori di terze parti possono scrivere DLL dei plugin e rilasciarli nella directory bin dell'app Web. Voglio che questi plug-in siano in grado di registrare i propri HttpModules, se necessario.
È possibile aggiungere o rimuovere HttpModules da e verso la pipeline in fase di esecuzione senza avere una voce corrispondente in Web.Config o devo modificare a livello di programmazione Web.Config quando si aggiungono / rimuovono moduli? So che entrambi i modi causeranno un riavvio di AppDomain, ma preferirei riuscire a farlo nel codice piuttosto che dover confondere il web.config per ottenere lo stesso effetto.
Soluzione
Deve essere fatto nel modo giusto tempo nel ciclo di vita di HttpApplication che è quando HttpApplication l'oggetto si inizializza (più volte, una volta per ogni istanza di HttpApplication). L'unico metodo dove questo funziona correttamente è HttpApplication Init ().
Per collegare un modulo tramite codice è possibile eseguire il codice come il seguente anziché la definizione di HttpModule in 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); } }
Tutto quello che fai è sovrascrivere il metodo Init () di HttpApplication e quindi accedere all'Init dell'istanza statica metodo. Init () del modulo si collega l'evento e il gioco è fatto.
Altri suggerimenti
Renditi conto che questa è una vecchia domanda, ma asp.net 4 offre alcune nuove funzionalità che possono aiutarti qui.
In particolare, ASP.NET 4 fornisce una funzionalità PreApplicationStartMethod
che può essere utilizzata per aggiungere HttpModules a livello di codice.
Ho appena pubblicato un post sul blog su http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx .
L'idea di base è creare un HttpApplication
derivato che offra la possibilità di aggiungere HttpModules in modo dinamico all'avvio, e poi li inizializza nella pipeline ogni volta che ogni istanza HttpApplication
è creato nel dominio dell'app.
La dll Microsoft.Web.Infrastructure.dll ha un metodo per questo all'interno della classe DynamicModuleUtility. La dll viene fornita con WebPages 1.0
public static class PreApplicationStartCode
{
private static bool _startWasCalled;
public static void Start()
{
if (_startWasCalled) return;
_startWasCalled = true;
DynamicModuleUtility.RegisterModule(typeof(EventTriggeringHttpModule));
}
}
Questo ha funzionato per me per la registrazione dinamica.
RegisterModule(typeof(RequestLoggerModule));
public class RequestLoggerModule : IHttpModule
{ ... }
? Nelle nuove versioni di ASP MVC è possibile utilizzare Gestione pacchetti per aggiungere un riferimento a WebActivatorX e quindi fare qualcosa del genere
using WhateverNameSpacesYouNeed;
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(YourApp.SomeNameSpace.YourClass), "Initialize")]
namespace YourApp.SomeNameSpace
{
public static void Initialize()
{
DynamicModuleUtility.RegisterModule( ... the type that implements IHttpModule ... );
}
}