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.

È stato utile?

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.

Via Blog di Rick Strahl

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

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

?

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 ... );
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top