2015-08-28 20 views
5

Sto creando un HTTPModule che può essere riutilizzato alcune volte, ma con parametri diversi. Pensa come esempio, un modulo di redirector di richiesta. Potrei usare un HTTPHandler ma non è un compito perché il mio processo deve funzionare a livello di richiesta, non a livello di estensione/percorso.Ottieni i parametri propri di HTTPModule in web.config?

In ogni modo, mi piacerebbe avere il mio web.config in questo modo:

<system.webServer> 
    <modules> 
     <add name="tpl01" type="TemplateModule" arg1="~/" arg2="500" />  
     <add name="tpl02" type="TemplateModule" arg1="~/" arg2="100" />  
    </modules> 
</system.webServer> 

Ma la maggior parte informazioni che ho trovato è stato this. Dico, sì, posso ottenere l'intero tag <modules>, ma in che modo ciascuna istanza del mio HTTPModule sa quali argomenti assumere? Se potessi ottenere il nome (tpl01 o tpl02) al momento della creazione, potrei esaminare i suoi argomenti per nome in seguito, ma non ho visto alcuna proprietà nella classe HTTPModule per ottenerlo.

Qualsiasi aiuto sarebbe davvero gradito. Grazie in anticipo! :)

+0

HttpModuleCollection ha una proprietà AllKeys. Per ogni chiave puoi ottenere (chiave) e controllare se il rendimento è uguale al tuo modulo per determinare il nome del modulo. –

risposta

-1

Questa potrebbe essere una soluzione per il problema.

In primo luogo, definire il modulo con i campi per quello che è necessario impostare dall'esterno:

public class TemplateModule : IHttpModule 
{ 
    protected static string _arg1; 
    protected static string _arg2; 

    public void Init(HttpApplication context) 
    { 
     _arg1 = "~/"; 
     _arg2 = "0"; 

     context.BeginRequest += new EventHandler(ContextBeginRequest); 
    } 

    // ... 
} 

Poi, dal vostro web app, ogni volta che è necessario utilizzare il modulo con un diverso insieme di quei valori, ereditare il modulo e sovrascrivere i campi:

public class TemplateModule01 : Your.NS.TemplateModule 
{ 
    protected override void ContextBeginRequest(object sender, EventArgs e) 
    { 
     _arg1 = "~/something"; 
     _arg2 = "500"; 

     base.ContextBeginRequest(sender, e); 
    } 
} 

public class TemplateModule02 : Your.NS.TemplateModule 
{ 
    protected override void ContextBeginRequest(object sender, EventArgs e) 
    { 
     _arg1 = "~/otherthing"; 
     _arg2 = "100"; 

     base.ContextBeginRequest(sender, e); 
    } 
} 
+0

Questo è solo un terribile errore di condizione di gara in attesa di accadere. Creare un nuovo metodo virtuale nella classe base e chiamarlo con argomenti diversi dalle classi figlie. Do * not * usa campi statici per passare argomenti, è sciocco. –

2

Penso che questa parte di configurazione (system.webServer \ modules \ add) non sia destinata a passare (memorizzare) i parametri ai moduli, ma a registrare l'elenco dei moduli per elaborare la richiesta.

Per le possibili atttributes in elemento di "aggiungere" Vedere - https://msdn.microsoft.com/en-us/library/ms690693(v=vs.90).aspx