Registrar programáticamente HttpModules en tiempo de ejecución
-
04-07-2019 - |
Pregunta
Estoy escribiendo una aplicación en la que los proveedores externos pueden escribir DLL de complementos y colocarlos en el directorio bin de la aplicación web. Quiero la capacidad de estos complementos para poder registrar sus propios HttpModules si es necesario.
¿Hay alguna forma de que pueda agregar o eliminar HttpModules desde y hacia la tubería en tiempo de ejecución sin tener una entrada correspondiente en Web.Config, o tengo que editar programáticamente Web.Config al agregar / eliminar módulos? Sé que de cualquier manera va a causar un reinicio de AppDomain, pero prefiero poder hacerlo en código en lugar de tener que manipular el web.config para lograr el mismo efecto.
Solución
Se tiene que hacer a la derecha tiempo en el ciclo de vida de HttpApplication que es cuando el HttpApplication el objeto se inicializa (varias veces, una vez por cada instancia de HttpApplication). El unico metodo donde esto funciona correctamente es HttpApplication Init ().
Para conectar un módulo a través del código puede Ejecutar código como el siguiente en lugar de la definición de 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 haces es anular el método Init () de HttpApplication y Luego accede a la instancia estática Init método. Init () del módulo se engancha El evento y listo.
A través de blog de Rick Strahl
Otros consejos
Tenga en cuenta que esta es una pregunta antigua, pero asp.net 4 proporciona algunas capacidades nuevas que pueden ayudar aquí.
Específicamente, ASP.NET 4 proporciona una capacidad de PreApplicationStartMethod
que se puede usar para agregar HttpModules mediante programación.
Acabo de hacer una publicación en el blog en http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx .
La idea básica es crear un HttpApplication
derivado que ofrezca la capacidad de agregar HttpModules dinámicamente en el momento del inicio, y luego los inicializa en la tubería cada vez que cada instancia de HttpApplication
es creado dentro del dominio de la aplicación.
La dll Microsoft.Web.Infrastructure.dll tiene un método para esto dentro de la clase DynamicModuleUtility. La dll se envía 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));
}
}
Esto me funcionó para el registro dinámico.
RegisterModule(typeof(RequestLoggerModule));
public class RequestLoggerModule : IHttpModule
{ ... }
En las nuevas versiones de ASP MVC, puedes usar Package Manager 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 ... );
}
}