Registrar programáticamente HttpModules en tiempo de ejecución


Estoy escribiendo una aplicación donde los proveedores de terceros pueden escribir DLL de plugin y soltarlos en el directorio bin de la aplicación web. Quiero que estos plugins puedan registrar sus propios HttpModules si es necesario.

Existe de todos modos que puedo agregar o eliminar HttpModules desde y hacia la canalización en tiempo de ejecución sin tener una entrada correspondiente en la Web.Config, o tengo que editar la Web mediante programación.Config al agregar / eliminar módulos? Sé que de cualquier manera va a causa un reinicio de AppDomain, pero prefiero poder hacerlo en código que tener que falsificar la web.config para lograr el mismo efecto.

Author: alexandrul, 2008-10-27

4 answers

Tiene que hacerse de la manera correcta tiempo en el ciclo de vida de la aplicación HttpApplication que es cuando la aplicación HttpApplication inicializa el objeto (varias veces, una vez por cada instancia de HttpApplication). El único método donde esto funciona correctamente es HttpApplication Init().

Para conectar un módulo a través de código 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 haces es sobrescribir el inicio de la aplicación HttpApplication() método y a continuación, acceda al Init de la instancia estática método. Init () del módulo se conecta el evento y listo.

A través de El blog de Rick Strahl

 48
Author: Aaron Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-30 09:29:16

Darse cuenta de que esta es una vieja pregunta, pero asp.net 4 proporciona algunas nuevas capacidades que pueden ayudar aquí.

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

Acabo de hacer una entrada de blog sobre eso en http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx .

La idea básica es crear un HttpApplication derivado que proporcione la capacidad de agregar HttpModules dinámicamente en el momento del inicio, y luego inicializarlos en la canalización cada vez que se crea cada instancia HttpApplication dentro del dominio de la aplicación.

 27
Author: Nikhil Kothari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 06:08:10

El dll Microsoft.Web.Infraestructura.dll tiene un método para esto dentro de la clase DynamicModuleUtility. El 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));
    }
}
 12
Author: Chris van de Steeg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-26 13:52:31

En las nuevas versiones de ASP MVC puede usar el Administrador 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 ... );
  }
}
 0
Author: Peter Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-09 10:48:57