2010-03-04 14 views
12

stworzyłem własny moduł HTTP i chcesz dodać ten moduł do konfiguracji internetowej. Aplikacja internetowa to projekt zawierający kilka "aplikacji podrzędnych". Podprogram to tylko folder, aw jego obrębie ma swój własny plik web.config. Robię to tak każdy wniosek ma swoją zawartość własnych aplikacji związanych, arkusze stylów, configs itpAsp.net HttpModule w poziomie katalogu web.config

Teraz stworzyłem moduł custom http. Dodając to do głównego pliku web.config, moduł działa poprawnie. Po dodaniu konfiguracji modułu http do pliku web.config na poziomie katalogu (np. /Applications/MyApplication/web.config) moduł nie jest już zainicjowany. Mimo że msdn stwierdza, że ​​element konfiguracyjny HttpModules działa również na poziomie katalogu. Ktoś wie, jak rozwiązać ten problem?

Odpowiedz

13

Aby echo Marvin Smit's comment, wydaje się, że konfigurowanie <modules> punkcie a <location> w web.config prostu nie działa - wszelkie moduły określone w ten sposób nie są wywoływane.

Co może zrobić, to podać moduł na poziomie głównym, i to kontrolowane przez appSetting, które mogą być hierarchicznie określonym i zamienione na wymagane:

<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> 

Następnie w kodzie dla CustomModule :

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

     return appSetting; 
    } 

ASP.NET zadba o to, że odpowiednia wartość UseCustomModule dla naszej aktualnej lokalizacji jest jednym czytamy.

+1

Z pewnością nie podoba mi się to, że to jest odpowiedź, ale dzięki za potwierdzenie tego, co podejrzewałem. – EricTheRed

+0

@AakashM: Niektóre obserwacje 1) Metoda ModuleEnabled() potrzebuje gdzieś wywołania, próbowałem wywoływać go w Init i zwracać, jeśli jest to wartość false, nie może uruchomić go z tego miejsca 2) Gdy wywołanie ModuleEnabled jest w wydarzenie np PreSendRequestHeaders, działa. Podsumowując, moduł zostaje zainicjalizowany raz, a następnie dla każdego wywołania zaznaczona jest flaga. pls popraw mnie, jeśli zauważysz jakiekolwiek rozbieżności. – dotnetguy

1

w IIS pod głównym aplikacji wybierz folder, który ma własną web.cofig z HttpModules zdefiniowana, kliknij prawym przyciskiem myszy i wybierz Właściwości, na zakładce Katalog kliknij przycisk Utwórz.

To stworzy sub aplikację i teraz HttpModules powinno działać.

+2

To naprawdę nie jest rozwiązaniem tbh. Zmienia położenie katalogu głównego aplikacji. Dlatego potrzebny jest nowy katalog bin na poziomie podrzędnym i wszystkie wcześniej skonfigurowane elementy w nowym pojemniku, jeśli nie są w GAC. Skutecznie zmienia twój model środowiska wykonawczego. Myślę, że to problem (błąd) polegający na tym, że nie ma fizycznej struktury folderów, ale mają wirtualne katalogi wskazujące różne lokalizacje na dysku twardym, które nie są powiązane z przodkiem/potomkiem! Wygląda na to, że ASP.net nie odczytuje/częściowo pliku web.config, jeśli jest to katalog v-dir, w którym folder nie jest potomkiem folderu witryny aplikacji. –

+5

Po prostu kontynuowałem badania. Jego projekt. Moduły i obsługa są skonfigurowane na poziomie aplikacji. (Dox stwierdza dowolny poziom, ale jest to dokument potwierdzony przez konstrukcyjne ograniczenie modelu usługi). –

1

Czy nie byłoby możliwe stworzenie własnego sekcji config że wymienia się katalogi, które chcesz włączyć lub wyłączyć swoje zachowanie modułu? Twój moduł może następnie sprawdzić, czy to powinno działać w oparciu o adres URL żądania.

wiem, że nie do końca, o co prosicie, ale na pewno daje zachowanie trzeba.

0

Baza HttpModule za tym przypadku może być następująca:

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() 
    { 
    } 
} 
Powiązane problemy