2008-10-27 9 views
38

Estoy escribiendo una aplicación en la que terceros proveedores pueden escribir archivos DLL de complementos y soltarlos en el directorio bin de la aplicación web. Quiero la capacidad de que estos complementos puedan registrar sus propios HttpModules si es necesario.Registrar programáticamente HttpModules en tiempo de ejecución

¿Hay alguna forma de que pueda agregar o eliminar HttpModules desde y hacia la canalización en tiempo de ejecución sin tener una entrada correspondiente en Web.Config, o tengo que editar programáticamente el Web.Config al agregar/eliminar módulos? Sé que de cualquier manera va a causar un reinicio de AppDomain, pero prefiero poder hacerlo en el código que tener que fudge web.config para lograr el mismo efecto.

Respuesta

45

Tiene que ser hecho en sólo el derecho tiempo en el ciclo de vida HttpApplication que es cuando se inicie la HttpApplication objeto (varias veces, una vez para cada instancia de HttpApplication). El único método donde esto funciona correcto es HttpApplication Init().

para conectar a través de un módulo de código que puede ejecutar código como el siguiente en lugar de la definición HttpModule en 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); 
    } 
    } 

Todo lo que hacer es reemplazar el método de la HttpApplication Init() y luego acceda al método Init de la instancia estática. Init() del módulo conecta el evento y listo.

Via Rick Strahl's blog

+0

Uno de los módulos somos using funciona correctamente cuando se hace referencia desde web.config, pero no se puede crear una instancia directamente (como se muestra en el código) porque se ha declarado amigo. ¿Alguna idea de qué contexto debería instanciarlo? – Patonza

26

cuenta de esto es una vieja pregunta, pero asp.net 4 proporciona algunos nuevos capablities que pueden ayudar aquí.

Específicamente, ASP.NET 4 proporciona una capacidad PreApplicationStartMethod que se puede utilizar para agregar HttpModules mediante programación.

Acabo de publicar un blog al http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx.

La idea básica es crear una HttpApplication derivada que proporcione la capacidad de agregar HttpModules dinámicamente en el momento del inicio, y luego los inicializa en la tubería siempre que cada instancia de HttpApplication se cree dentro del dominio de la aplicación.

+12

Blog muerto ... enlace de retorno: http://wayback.archive.org/web/20120719043729/http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx – felickz

12

El dll Microsoft.Web.Infrastructure.dll tiene un método para esto dentro de la clase DynamicModuleUtility. El DLL se suministra con páginas web 1,0

public static class PreApplicationStartCode 
{ 
    private static bool _startWasCalled; 

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

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

En las nuevas versiones de ASP MVC puede utilizar el gestor de paquetes para agregar una referencia a WebActivatorX y luego hacer algo como esto

using WhateverNameSpacesYouNeed; 

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