Che cos'è route.IgnoreRoute ("{resource} .axd / {* pathInfo}")


Risposte:


81

I file .axd non esistono fisicamente. ASP.NET utilizza internamente URL con estensioni .axd (ScriptResource.axd e WebResource.axd) e vengono gestiti da un HttpHandler.

Pertanto, è necessario mantenere questa regola, per impedire che ASP.NET MVC tenti di gestire la richiesta invece di lasciare che lo faccia l'HttpHandler dedicato.


5
Sono abbastanza sicuro che vorresti che le persone fossero in grado di scaricare i "file axd" sul tuo sito poiché contengono javascript e stili.
Moulde

3
Questa risposta non è corretta. Il motivo per inserire IgnoreRoutela configurazione di routing di MVC è garantire che MVC non tenti di gestire la richiesta. Questo perché gli .axdendpoint devono essere gestiti da un altro gestore HTTP (un gestore che non fa parte di MVC) per poter servire gli script.
NightOwl888

1
Questo è del tutto inutile in .NET core? Ho cercato su Google per circa un'ora e non riesco a trovare alcun riferimento per quali sarebbero i passaggi equivalenti, quindi presumo che semplicemente non sia necessario.
Dinerdo

35

Qualche sfondo

Se apri questo file:

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

lo troverai all'interno del file:

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

Questo in pratica sta dicendo al runtime di Asp.NET: "Ehi asp.net amico, se arriva una richiesta per WebResource.axd, usa AssemblyResourceLoader per elaborare la richiesta."

Si prega di notare che WebResource.axd NON è un file ma semplicemente una mappa (se posso dire) a AssemblyResourceLoader. È il nome con cui è registrato il gestore. Sulla mia macchina, ho trovato i seguenti gestori .axd:

<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, quindi cosa fa quel gestore?

La AssemblyResourceLoadersa come cercare file incorporati all'interno di un assieme in modo che possa servire (la invia al cliente ovvero un browser). Ad esempio, nei moduli Web di asp.net, se si utilizzano i controlli di convalida, questi dipendono da alcuni javascript per visualizzare gli errori nella pagina Web. Tuttavia, quel javascript è incorporato in un assembly. Il browser ha bisogno del javascript quindi lo vedrai nell'html della pagina:

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

La AssemblyResourceLoadertroverà l'assemblea in cui il javascript è incorporato utilizzando le informazioni nella querystring e restituire il JavaScript.


Torna alla domanda

Quindi, per rispondere alla domanda, cos'è:

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

Questo sta dicendo al motore di routing che non elaboreremo quelle richieste che corrispondono a quel pattern di route. In altre parole, non elaboreremo le .axdrichieste. Perché? Perché MVC stesso è un HttpHandler simile a .axde .aspxe molti altri gestori presenti nel file web.config. Il gestore MVC non sa come elaborare la richiesta, ad esempio la ricerca di risorse incorporate in un assembly, AssemblyResourceLoadersa come farlo. MVC sa come fare, beh tutto ciò che fa che va oltre lo scopo di questa domanda e risposta.


2
Questa sicuramente dovrebbe essere la risposta accettata, più una da parte mia.
Yahya

Infine, una chiara spiegazione di ciò che WebResource.axd fa effettivamente fornendo anche una risposta chiara alla domanda. Grazie
ben_mj

18

Il percorso con il pattern {resource} .axd / {* pathInfo} è incluso per impedire che le richieste per i file di risorse Web come WebResource.axd o ScriptResource.axd vengano trasmesse a un controller.

Leggi il link: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx

Puoi anche specificare che il routing non deve gestire determinate richieste URL. Impedisci al routing di gestire determinate richieste definendo una route e specificando che la classe StopRoutingHandler deve essere utilizzata per gestire quel pattern. Quando una richiesta viene gestita da un oggetto StopRoutingHandler , l' oggetto StopRoutingHandler blocca qualsiasi elaborazione aggiuntiva della richiesta come route. La richiesta viene invece elaborata come una pagina ASP.NET, un servizio Web o un altro endpoint ASP.NET. È possibile utilizzare il metodo RouteCollection.Ignore (o RouteCollectionExtensions.IgnoreRoute per le applicazioni MVC) per creare route che utilizzano la classe StopRoutingHandler .



7

Quelli non sono file (non esistono su disco) - sono solo nomi con i quali sono registrati alcuni gestori HTTP.


risposta più pertinente direi.
Sakthivel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.