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.

¿Fue útil?

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
    { ... }

https : //docs.microsoft.com/en-us/dotnet/api/system.web.httpapplication.registermodule? view = netframework-4.7.2

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 ... );
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top