6 votes

Impossible d'arrêter le déclenchement du module ASP.NET pour le contenu statique

J'ai un module dans une application ASP.NET MVC. Le module fonctionne bien, mais il se déclenche pour chaque type de fichier, y compris le contenu statique, même si j'ai :

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

Le module accroche les événements AcquireRequestState et PostRequestHandlerExecute et tous deux affichent un contenu statique (.htm, .css, .png, etc.).

J'avais l'impression que runAllManagedModulesForAllRequests="false" devrait empêcher les modules de se déclencher sur du contenu non-ASP.NET.

Pour plus de clarté :

I peut définir preCondition="managedHandler" comme ceci :

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

et de faire en sorte que mon module n'envoie que des requêtes gérées.

Cependant, j'essaie de comprendre pourquoi le pipeline IIS en général déclenche des hits de modules gérés pour chaque requête. Je pense que cela fonctionnait très bien dans les anciennes versions où, à moins que runAllManagedModulesForAllRequests="true", le contenu non géré n'était pas envoyé dans les modules ASP.NET.

Exécution sur IIS8 sous Windows 8 64 bit, avec mode pipeline intégré.

Mise à jour :

Après quelques recherches supplémentaires, il s'avère que ce qui suit est vrai :

  • si runAllManagedModulesForAllRequests="true", tous les modules - indépendamment de leur attribut preCondition - se déclenchent pour toutes les requêtes. Ceci est également vrai pour les événements Application_XXXX mis en œuvre sur l'application HttpApplication
  • runAllManagedModulesForAllRequests="false" n'a pas pour effet d'empêcher les requêtes non gérées d'atteindre les modules, sauf si preCondition="managedHandler" est défini
  • runAllManagedModulesForAllRequests="false" affecte les événements de Application_XXXX, en faisant en sorte que ces événements ne se déclenchent que sur les requêtes gérées. En d'autres termes, Application_XXXX se comporte comme si l'implémentation du module avait une preCondition="managedHandler"

Pour plus d'informations à ce sujet, j'ai publié un article de blog : http://www.west-wind.com/weblog/posts/2012/Oct/25/Caveats-with-the-runAllManagedModulesForAllRequests-in-IIS-78

7voto

samss Points 86

Dans IIS7, Microsoft a introduit une nouvelle façon de développer des modules et des gestionnaires en utilisant du code géré (.NET), et pas seulement du code natif. Le problème est que le passage d'une requête entre le code géré et le code natif est très coûteux. preCondition="managedHandler" . Il signale que le module n'est disponible que pour les requêtes de contenu géré (.aspx, .asmx, ...), de sorte qu'IIS évite de le déclencher pour le contenu statique.

Il peut arriver que vous souhaitiez modifier une requête de contenu statique, par exemple en minifiant JavaScript à la volée. Vous pouvez écrire le module en C# et le compiler en tant que module géré, mais vous voulez qu'il soit déclenché pour le contenu statique, donc vous ne le marquez simplement pas comme managedHandler .

Enfin, runAllManagedModulesForAllRequests="true" est utilisé pour remplacer le preCondition="managedHandler" Ils sont donc tous licenciés.

Plus d'informations sont disponibles à l'adresse suivante
http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Precondition

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X