web-dev-qa-db-fra.com

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

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

Je ne trouve aucun fichier .axd dans mon projet. Puis-je supprimer cette règle de routage?

89
Eric Yin

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 afin d'empêcher ASP.NET MVC d'essayer de gérer la demande au lieu de laisser le HttpHandler dédié le faire.

73
Roy Dictus

Un peu de fond

Si vous ouvrez ce fichier:

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

vous le trouverez dans le fichier:

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

En gros, cela signifie au moteur d’exécution Asp.NET: "Salut asp.net, si une requête arrive pour WebResource.axd, utilisez alors AssemblyResourceLoader pour traiter la requête."

S'il vous plaît faites notez que WebResource.axd n'est PAS un fichier mais simplement une carte (si je puis dire) à 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 AssemblyResourceLoader sait comment rechercher des fichiers incorporés dans un assemblage afin de pouvoir le servir (envoyez-le 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 JavaScript pour afficher les erreurs sur la page Web. Cependant, ce javascript est intégré dans un assemblage. Le navigateur a besoin de javascript pour que vous puissiez le voir dans le code HTML de la page:

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

Le AssemblyResourceLoader trouvera l'assembly dans lequel le javascript est incorporé à l'aide des informations de la chaîne de requête et renvoie le javascript.


Retour à la question

Donc, pour répondre à la question, quelle est:

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

Cela indique au moteur de routage que nous ne traiterons pas les demandes correspondant à ce modèle de route. En d'autres termes, nous ne traiterons pas les demandes .axd. Pourquoi? Parce que MVC lui-même est un HttpHandler similaire à .axd Et .aspx Et à de nombreux autres gestionnaires figurant dans le fichier web.config. Le gestionnaire MVC ne sait pas comment traiter la demande, par exemple en recherchant des ressources incorporées dans un assembly. Le AssemblyResourceLoader sait comment procéder. MVC sait comment faire, et bien tout ce qu'il fait qui dépasse le cadre de cette question et de cette réponse.

Here est un excellent article qui explique .axd Plus en détail.

24
CodingYoshi

La route avec le motif {ressource} .axd/{* pathInfo} est incluse pour empêcher la transmission de demandes aux fichiers de ressources Web, tels que WebResource.axd ou ScriptResource.axd, à un contrôleur.

Lien de lecture: 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 un itinéraire 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 que route. 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 utilisant la classe StopRoutingHandler .

18
Kumar Manish-PMP

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

7
Kumar Manish-PMP
7
TwTw