Cosa è routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
Non riesco a trovare alcun file .axd nel mio progetto, posso rimuovere questa regola di percorso?
Risposte:
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.
IgnoreRoute
la configurazione di routing di MVC è garantire che MVC non tenti di gestire la richiesta. Questo perché gli .axd
endpoint devono essere gestiti da un altro gestore HTTP (un gestore che non fa parte di MVC) per poter servire gli script.
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 AssemblyResourceLoader
sa 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...&t=6342..." type="text/javascript"></script>
La AssemblyResourceLoader
troverà 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 .axd
richieste. Perché? Perché MVC stesso è un HttpHandler simile a .axd
e .aspx
e 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, AssemblyResourceLoader
sa come farlo. MVC sa come fare, beh tutto ciò che fa che va oltre lo scopo di questa domanda e risposta.
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 .
Dai un'occhiata al link sottostante: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
Quelli non sono file (non esistono su disco) - sono solo nomi con i quali sono registrati alcuni gestori HTTP.