Qu'est-ce que routes.IgnoreRoute ("{resource} .axd / {* pathInfo}")

95

Quel est routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Je ne trouve aucun fichier .axd dans mon projet, puis-je supprimer cette règle d'itinéraire?

Eric Yin
la source

Réponses:

81

Les fichiers .axd n'existent pas physiquement. ASP.NET utilise des URL avec des extensions .axd (ScriptResource.axd et WebResource.axd) en interne, et elles sont gérées par un HttpHandler.

Par conséquent, vous devez conserver cette règle pour empêcher ASP.NET MVC d'essayer de gérer la demande au lieu de laisser le HttpHandler dédié le faire.

Roy Dictus
la source
5
Je suis presque sûr que vous voudriez que les gens puissent télécharger les "fichiers axd" sur votre site car ils contiennent du javascript et des styles.
Moulde
3
Cette réponse est incorrecte. La raison de la mise IgnoreRoutedans la configuration de routage de MVC est de s'assurer que MVC n'essaye pas de gérer la demande. En effet, les .axdpoints de terminaison doivent être gérés par un autre gestionnaire HTTP (un gestionnaire qui ne fait pas partie de MVC) afin de servir les scripts.
NightOwl888
1
Est-ce totalement inutile dans .NET Core? J'ai cherché sur Google pendant environ une heure et je ne trouve aucune référence pour ce que seraient les étapes équivalentes, donc je suppose que ce n'est tout simplement pas nécessaire.
Dinerdo
35

Quelques Contexte

Si vous ouvrez ce fichier:

%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config

vous trouverez ceci dans le fichier:

<add path="WebResource.axd"
     verb="GET"
     type="System.Web.Handlers.AssemblyResourceLoader"
     validate="True" />

C'est essentiellement dire au runtime Asp.NET: "Hey mec asp.net, si une demande vient pour WebResource.axd alors utilisez AssemblyResourceLoader pour traiter la demande."

Veuillez noter que WebResource.axd n'est PAS un fichier mais simplement une carte (si je puis dire) vers AssemblyResourceLoader. C'est le nom sous lequel le gestionnaire est enregistré. Sur ma machine, j'ai trouvé les gestionnaires .axd suivants:

<add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
<add verb="*" path="*_AppService.axd" 

Ok, alors que fait ce gestionnaire?

Le AssemblyResourceLoadersait comment rechercher des fichiers incorporés dans un assemblage afin qu'il puisse le servir (l'envoyer au client c'est-à-dire un navigateur). Par exemple, dans les formulaires Web asp.net, si vous utilisez les contrôles de validation, ils dépendent de certains javascript pour afficher les erreurs sur la page Web. Cependant, ce javascript est intégré dans un assembly. Le navigateur a besoin du javascript donc vous verrez ceci dans le html de la page:

<script src="/YourSite/WebResource.axd?d=fs7zUa...&amp;t=6342..." type="text/javascript"></script>

Le AssemblyResourceLoadertrouvera l'assembly dans lequel le javascript est incorporé en utilisant les informations de la chaîne de requête et retournera le javascript.


Retour à la question

Alors pour répondre à la question, qu'est-ce que c'est:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Cela indique au moteur de routage que nous ne traiterons pas les demandes qui correspondent à ce modèle d'itinéraire. En d'autres termes, nous ne traiterons pas les .axddemandes. Pourquoi? Parce que MVC lui-même est un HttpHandler similaire à .axdand .aspxet à de nombreux autres gestionnaires qui se trouvent dans le fichier web.config. Le gestionnaire MVC ne sait pas comment traiter la demande, comme la recherche de ressources incorporées dans un assembly, il AssemblyResourceLoadersait comment le faire. MVC sait faire, bien tout ce qu'il fait qui dépasse le cadre de cette question et réponse.

CodageYoshi
la source
2
Cela devrait certainement être la réponse acceptée, plus une de ma part.
Yahya
Enfin, une explication claire de ce que fait réellement WebResource.axd tout en fournissant une réponse claire à la question. Merci
ben_mj
18

La route avec le modèle {resource} .axd / {* pathInfo} est incluse pour empêcher les requêtes des fichiers de ressources Web tels que WebResource.axd ou ScriptResource.axd d'être transmises à un contrôleur.

Lire le lien: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx

Vous pouvez également spécifier que le routage ne doit pas gérer certaines demandes d'URL. Vous empêchez le routage de gérer certaines demandes en définissant une route et en spécifiant que la classe StopRoutingHandler doit être utilisée pour gérer ce modèle. Lorsqu'une demande est gérée par un objet StopRoutingHandler , l' objet StopRoutingHandler bloque tout traitement supplémentaire de la demande en tant qu'itinéraire . Au lieu de cela, la demande est traitée en tant que page ASP.NET, service Web ou autre point de terminaison ASP.NET. Vous pouvez utiliser la méthode RouteCollection.Ignore (ou RouteCollectionExtensions.IgnoreRoute pour les applications MVC) pour créer des itinéraires qui utilisent la classe StopRoutingHandler .

Kumar Manish
la source
7

Ce ne sont pas des fichiers (ils n'existent pas sur le disque) - ce ne sont que des noms sous lesquels certains gestionnaires HTTP sont enregistrés.

Kumar Manish
la source
réponse la plus pertinente que je dirais.
Sakthivel