2012-10-25 18 views
6

Mam moduł w aplikacji ASP.NET MVC. Moduł pracuje bez zarzutu, ale to strzelania do każdego rodzaju pliku tym statyczny chociaż mam:Nie można zatrzymać wypalania modułu ASP.NET dla zawartości statycznej

<modules runAllManagedModulesForAllRequests="false"> 
    <add name="MyModule" .../> 
</modules> 

Te haki Moduł AcquireRequestState i PostRequestHandlerExecute wydarzenia i pokazać zarówno statyczny wypalania (.htm, .css. png itp.).

Miałem wrażenie, że runAllManagedModulesForAllRequests = "false" powinno uniemożliwiać modułom uruchamianie treści spoza usługi.

Dla wyjaśnienia:

I może zestaw warunek wstępny = "managedHandler" tak:

<add name="MyModule" type="MyApp.MyModule" preCondition="managedHandler" /> 

i dostać mój moduł na ogień tylko udało żądań.

Jednak staram się zrozumieć, dlaczego rurociąg IIS generalnie uruchamia trafienia modułu zarządzanego dla każdego żądania. Myślę, że to działało dobrze w starszych wersjach, gdzie dopóki runAllManagedModulesForAllRequests = "true" nie uruchamia niezarządzanej zawartości do modułów ASP.NET.

Działa na IIS8 w systemie Windows 8 w trybie 64-bitowym, ze zintegrowanym trybem potoku.

Aktualizacja:

Po kilku dalszych badań okazuje się, że prawdziwe są następujące:

  • jeśli runAllManagedModulesForAllRequests = „true” wszystkie moduły - niezależnie od ich warunek konieczny atrybut podpalanie na wszystkich żądań . To samo dotyczy wydarzeń Application_XXXX wdrożyć na HttpApplication
  • runAllManagedModulesForAllRequests = „false” nie ma wpływu na utrzymanie niezarządzanymi żądania od uderzenia modułów chyba warunek wstępny = „managedHandler” jest ustawiony
  • runAllManagedModulesForAllRequests = „false” wpływa Application_XXXX zdarzeń, powodując, że zdarzenia te będą wtedy uruchamiane tylko wtedy, gdy będą zarządzać żądaniami. IOW, Application_XXXX zachowuje się tak, jakby „moduł” realizacja miała warunek wstępny = „managedHandler”

celu uzyskania bardziej szczegółowych informacji na ten temat napisałem wpis blogu: http://www.west-wind.com/weblog/posts/2012/Oct/25/Caveats-with-the-runAllManagedModulesForAllRequests-in-IIS-78

+0

można sprawdzić, StaticFileModule jest zarejestrowana pod modułów? Powinien wskazywać% windir% \ System32 \ inetsrv \ static.dll – pbz

+0

Po prostu do sprawdzenia poprawności, czy możesz zaktualizować z pełnym pochodzenie węzła ? Powinien znajdować się w . Tak jak powiedziałem, sprawdzenie stanu psychicznego. :) –

+0

Ponadto, jeśli dobrze pamiętam, potrzebna jest opcja preCondition = "managedHandler" dla modułów -> dodaj – pbz

Odpowiedz

7

w IIS7 Microsoft wprowadził nowy sposób tworzenie modułów i procedur obsługi za pomocą kodu zarządzanego (.NET), a nie tylko kodu natywnego. Problem z przełączaniem żądania między kodem zarządzanym i natywnym jest bardzo kosztowny, dlatego firma Microsoft wprowadziła kod preCondition="managedHandler". Oznacza moduł jako dostępny tylko dla żądań zarządzanych treści (.aspx, .asmx, ...), więc usługi IIS unikają uruchamiania go dla zawartości statycznej.

Teraz możesz mieć sytuację, w której chcesz zmodyfikować żądanie zawartości statycznej, na przykład zminimalizować JavaScript w locie. Możesz napisać moduł przy użyciu C# i skompilować go jako moduł zarządzany, ale chcesz go wypalić dla zawartości statycznej, więc po prostu nie oznaczaj go jako managedHandler.

Wreszcie, runAllManagedModulesForAllRequests="true" służy do przesłonięcia preCondition="managedHandler", więc wszystkie z nich zostają zwolnione.

Jest więcej informacji pod adresem:
http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Precondition

+0

Sam - z tego co rozumiem, usługi IIS nie uruchamiają automatycznie zarządzanego kodu. Ale podejrzewam, że to może być teraz prawdą - jak tylko DOWOLNY zarządzany moduł jest w przygotowaniu, to może zacząć strzelanie dla wszystkich żądań. Bardziej niepokoję się wydajnością niż logiką rzeczy. Fakt, że statyczna zawartość trafia do zarządzanego potoku, wydaje się znacznie zwiększać ogólne obciążenie wnioskami. –

Powiązane problemy