2010-03-04 32 views
12

Ho creato un modulo http personalizzato e voglio aggiungere questo modulo alla configurazione web. L'applicazione web è un progetto che contiene diverse "sotto-applicazioni". Un'applicazione secondaria è solo una cartella e all'interno di quella cartella ha il proprio web.config. Lo sto facendo in modo che ogni applicazione abbia i propri contenuti relativi alle applicazioni, fogli di stile, configurazioni, ecc.Asp.net HttpModule a livello di directory web.config

Ora ho creato un modulo http personalizzato. Quando si aggiunge questo alla web.config di root, il modulo funziona correttamente. Quando si aggiunge la configurazione del modulo http al web.config a livello di directory (ad esempio /Applications/MyApplication/web.config), il modulo non viene più inizializzato. Anche se msdn afferma che l'elemento di configurazione HttpModules funziona anche a livello di directory. Qualcuno sa come risolvere questo?

risposta

13

Per eco Marvin Smit's comment, sembra che la configurazione di <modules> sotto un <location> in web.config semplicemente non funziona - tutti i moduli specificati in questo modo non vengono richiamati.

Quello che possibile fare è specificare il modulo a livello principale, e lo hanno controllato da un appSetting, che può essere gerarchicamente specificato e ignorata come richiesto:

<configuration> 


    <appSettings> 
    <add key="UseCustomModule" value="false"/> 
    </appSettings> 


    <location path="MyFolder"> 
    <appSettings> 
     <add key="UseCustomModule" value="true"/> 
    </appSettings> 
    <system.webServer> 
     <modules> 
     <!-- CANNOT add module at this level, hence the overridden appSetting --> 
     </modules> 
    </system.webServer> 
    </location> 

    <system.webServer> 
    <modules> 
     <add name="CustomnModule" type="MyApplication.CustomModule" /> 
    </modules> 
    </system.webServer> 

</configuration> 

Poi all'interno del codice per CustomModule :

private static bool ModuleEnabled() 
    { 
     bool appSetting; 
     if (!bool.TryParse(ConfigurationManager.AppSettings["UseCustomModule"], 
          out appSetting)) 
      appSetting = false; 

     return appSetting; 
    } 

ASP.NET farà in modo che il valore appropriato di UseCustomModule per la nostra posizione attuale è quello che leggiamo.

+1

Non mi piace il fatto che questa sia la risposta, ma grazie per aver confermato ciò che sospetto. – EricTheRed

+0

@AakashM: alcune osservazioni 1) Il metodo ModuleEnabled() ha bisogno di una chiamata da qualche parte, ho provato a chiamarlo in Init e restituisce se restituisce false, non è riuscito a farlo funzionare da lì 2) Quando la chiamata a ModuleEnabled è in una evento eg PreSendRequestHeaders, funziona. Per riassumere, Modulo viene inizializzato una volta e quindi per ogni chiamata, il flag è controllato. pls correggimi se vedi qualche discrepanza. – dotnetguy

1

In IIS sotto l'applicazione di root selezionare la cartella con proprio web.cofig con HttpModules definiti, fare clic con il tasto destro del mouse e selezionare proprietà, nella scheda Directory fare clic sul pulsante Crea.

Creerà l'applicazione secondaria e ora HttpModules dovrebbe funzionare.

+2

Questo non è davvero una soluzione tbh. Cambia la posizione della radice dell'applicazione. Pertanto è necessaria una nuova directory bin nel sottolivello e tutti gli elementi precedentemente configurati nel nuovo bin se non sono GAC. Cambia in modo efficace il tuo modello di runtime. Penso che sia un problema (bug) di non avere una struttura di cartelle fisiche ma avere directory virtuali che puntano a posizioni diverse sul disco rigido che non sono correlate antenato/discendente! Sembra che ASP.net non stia leggendo/in parte il web.config se proviene da una directory v in cui la cartella non è un discendente della cartella del sito Web dell'applicazione. –

+5

Appena seguito sulla ricerca. È di design. I moduli e i gestori sono configurati a livello di applicazione. (Dox indica qualsiasi livello, ma questo è un documento indirizzato dal vincolo di progettazione del modello di servizio) –

1

Non sarebbe possibile creare una sezione di configurazione personalizzata che elenchi le directory che si desidera includere o escludere il comportamento del modulo? Il tuo modulo potrebbe quindi ispezionare quello per vedere se dovrebbe fare il lavoro basato sull'URL della richiesta.

So che non è proprio quello che stai chiedendo, ma certamente ti darei il comportamento che ti serve.

0

HttpModule Base per questo caso potrebbe essere la seguente:

public abstract class PathBasedHttpModule : IHttpModule 
{ 
    public abstract void Init(HttpApplication context); 

    protected EventHandler BuildConditionalEventHandler(Action<object, EventArgs> targetHandler) 
    { 
     EventHandler action = (sender, args) => 
     { 
      var settingsValue = CloudConfigurationManager.GetSetting(ModuleEnabledAppSettings); 
      if (!string.IsNullOrEmpty(settingsValue) && bool.Parse(settingsValue)) 
      { 
       targetHandler(sender, args); 
      } 
     }; 
     return action; 
    } 

    protected abstract string ModuleEnabledAppSettings 
    { 
     get; 
    } 

    public void Dispose() 
    { 
    } 
} 
Problemi correlati