Question

En créant des IHttpModules personnalisés, j'ai réalisé que les demandes de fichiers statiques (par exemple: les fichiers .css et .js) atteignent les modules gérés. Les images ont probablement le même problème. IIS ne devrait-il pas contourner ASP.NET pour les fichiers qui existent dans le système de fichiers?

Par exemple:

public class MyModule:IHttpModule
{
    public void Dispose(){ }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
    }
}

Et je le déclare de cette façon:

<modules runAllManagedModulesForAllRequests="true">
  <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>

Mais, même en utilisant la condition préalable, je peux voir comment les fichiers statiques passent par le module:

Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js

J'ai essayé d'ignorer les règles pour les fichiers statiques, mais cela ne fait aucune différence:

routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");

Est-ce habituel? Ou est-ce que je manque quelque chose ici? Autant que je sache, si la demande de fichier statique doit être répondu par IIS. Si mon module géré est touché, cela signifie qu'un thread CLR ThreadPool gère cette demande, n'est-ce pas?

Cordialement.

MISE À JOUR:

J'ai désactivé le "runAllManagedModulesForAllRequests":

<modules runAllManagedModulesForAllRequests="false">
      <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>

Et tout semble bien fonctionner, mais j'ai trouvé cet article: http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html qui recommande de supprimer et de lire le module "UrlRoutingModule-4.0" avec une condition préalable vide .

Sur ma machine, l'ajout de ce module se trouve dans la racine web.config, et il a déjà une pré-condition vide:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>

Alors maintenant, je suis un peu confus, quel est le statut de ce paramètre? Dois-je l'utiliser ou non? pourquoi est-il "vrai" par défaut?

Cordialement.

Était-ce utile?

La solution

Je suis ma machine, l'ajout de ce module est dans la racine web.config, et il a déjà une pré-condition vide

Parfait.Cela signifie que ce module fonctionnera toujours, ce qui est requis pour MVC car il utilise des URL sans extension.

Alors maintenant, je suis un peu confus, quel est le statut de ce paramètre?Dois-je l'utiliser ou non?pourquoi est-il "vrai" par défaut?

Parce que la prise en charge des URL sans extension est nouvelle dans IIS7 SP1 et IIS7.5 SP1. Il est disponible pour IIS7 sous forme de correctif que vous devez demander et installer. Vous le trouverez ici avec des réponses complètes à vos questions: http://support.microsoft.com/kb/980368

Pourquoi ce paramètre devient vrai par défaut?Parce que VS2010 a été livré avant IIS7 SP1. Peut-être que c'est faux dans les nouveaux projets MVC dans VS2010SP1?

Autres conseils

Réponse à votre première question sur le fait qu'IIS doit contourner ASP.NET pour le contenu statique.

S'il est configuré en mode intégré, IIS 7.5, permettra aux modules gérés de s'enregistrer pour les événements liés aux requêtes qui ne sont pas traditionnellement gérées par ASP.NET, comme les fichiers statiques.

Cela ne se produit pas en mode classique IIS 7.5, qui est similaire à IIS 6 et ne permet pas à un module géré d'écouter les événements dans les demandes qui ne sont pas gérées par ASP.NET.

Donc, fondamentalement, si vous avez runAllManagedModulesForAllRequests="true" avec mode intégré, votre module géré sera informé des événements pour chaque requête. Aussi, à partir de la documentation sur runAllManagedModulesForAllRequests :

Vrai si tous les modules gérés peuvent traiter toutes les requêtes, même si le la demande ne concernait pas le contenu géré; sinon, faux.

La valeur par défaut est false.

La documentation n'explique pas comment cet attribut interagit avec l'option preCondition. D'après ce que vous avez expérimenté, il semble remplacer la configuration de preCondition, donc si vous étiez, je le laisserais à false et travaillerais simplement avec les options preCondition même si cela signifie modifier les conditions préalables d'autres modules en une chaîne vide pour contourner le changement de runAllManagedModulesForAllRequests en false .


Mise à jour: J'ai trouvé de la documentation sur le implications de l'utilisation de runAllManagedModulesForAllRequests et comme déjà indiqué, si c'est vrai, est un remplacement pour preCondition avec une option managedHandler.

Vous pouvez également utiliser un raccourci pour activer tous les modules gérés (ASP.NET) exécuter pour toutes les demandes de votre application, quel que soit le Condition préalable "managedHandler". Pour activer l'exécution de tous les modules gérés pour toutes les demandes sans configurer chaque entrée de module pour supprimer le Condition préalable "managedHandler", utilisez la propriété runAllManagedModulesForAllRequests dans la section:

Lorsque vous utilisez cette propriété, la condition préalable "managedHandler" n'a pas effet et tous les modules gérés s'exécutent pour toutes les requêtes.

Vous pouvez écrire le code suivant pour cela.

routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });

Veuillez trouver plus d'informations sur le lien ci-dessous

http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

Je suppose que si vous souhaitez vraiment ignorer, vous ne devriez pas utiliser de crochets courbes:

routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");

Essayez ceci pour ignorer la liste de tous les fichiers statiques

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top