2009-10-02 5 views
2

Je suis en train de développer un module http qui se connecte au module FormsAuthentication via l'événement Authenticate. Pendant le débogage, j'ai remarqué que le module (et tous les autres modules enregistrés) était frappé à chaque fois que le client demandait une ressource (également quand il demandait des images, des feuilles de style, des fichiers javascript (etc.)). Cela se produit lors de l'exécution sur un serveur IIS 7 en mode pipeline intégré et du débogage via le serveur webdev (en mode pipeline non intégré)Http Les modules sont appelés à chaque requête lors de l'utilisation du module mvc/routing

Comme je développe un site Web avec beaucoup d'images qui ne sont généralement pas mises en cache par le navigateur client, il va frapper les modules beaucoup de temps unnessecary. J'utilise MVC et son mécanisme de routage (System.Web.Routing.UrlRoutingModule). Lors de la création d'un nouveau site Web, l'attribut runAllManagedModulesForAllRequests de la section IIS 7 (system.webServer) est défini par défaut sur true dans le fichier web.config, qui, comme son nom l'indique, appelle tous les modules pour chaque requête.

Si je mets l'attribut runAllManagedModulesForAllRequests à false, aucun module ne sera appelé.

Il semble que la raison en soit à cause du module de routage ou mvc (ne sais pas exactement pourquoi), ce qui fait que le gestionnaire asp.net (aspx) n'est jamais appelé et donc les événements et les modules ne sont jamais appelés (Une fois seulement comme supposé).

J'ai testé cela en essayant d'appeler "mydomain.com/Default.aspx" au lieu de simplement "mydomain.com/" et correctement il appelle les modules une seule fois comme il est supposé.

Comment est-ce que je corrige ceci pour appeler seulement les modules une fois quand la page est demandée et pas aussi quand toutes les autres ressources sont demandées?

Y at-il un moyen que je peux enregistrer que toutes les demandes doivent déclencher le gestionnaire asp.net (aspx), à l'exception des demandes pour des extensions de type de fichier spécifiques? Bien sûr, cela ne résoudra pas le problème si je choisis d'utiliser des URLs comme/content/images/myimage123 pour les images (sans l'extension). Mais je ne peux pas penser à un autre moyen de le réparer.

Existe-t-il une meilleure façon de résoudre ce problème?

J'ai essayé de mettre en place un ignoreRoute comme ceci routes.IgnoreRoute ("content/{* pathInfo}"); où le dossier de contenu contient toutes les images, javascripts et stylesheets dans les sous-dossiers de seperat, mais il ne semble pas changer quoi que ce soit.

Je peux y voir de nombreuses possibilités différentes lors de la configuration d'un gestionnaire mais je n'arrive pas à comprendre comment il devrait être possible d'en configurer un qui permettra d'utiliser le module de routage et d'avoir des URL comme/blog/post123 et ne pas appeler les modules lors de la demande d'images, de javascripts et de feuilles de style (etc.).

J'espère que quelqu'un là-bas peut m'aider?

Martin

+0

Déplacer toutes les images, feuilles de style et javascripts à un sous-domaine va bien sûr résoudre le problème. Mais comme il s'agit d'un problème général avec tous les sites utilisant le module mvc/routing (il semble) et le même domaine pour tout le contenu j'espère que quelqu'un là-bas a une solution à ce problème? – MartinF

Répondre

0

Le problème semble être le module de routage. La solution consiste à déplacer des images, css, js vers un sous-domaine, ou vous pouvez probablement enregistrer les types de fichiers/extensions que le module de routage doit ignorer.

0

Le code suivant est ce que je l'utilise dans toutes les applications MVC afin d'éviter la surcharge provoquée par le système de routage sur le service des fichiers statiques, javascript, css, etc:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = false; 
    routes.LowercaseUrls = true; 
    routes.AppendTrailingSlash = true; 
    routes.IgnoreRoute("Content/{*pathInfo}"); 
    routes.IgnoreRoute("Scripts/{*pathInfo}"); 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

    /* ... */ 
} 
Questions connexes