Was ist route.IgnoreRoute ("{resource} .axd / {* pathInfo}")

95

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

Ich kann keine .axd-Datei in meinem Projekt finden. Kann ich diese Routenregel entfernen?

Eric Yin
quelle

Antworten:

81

.axd-Dateien existieren physisch nicht. ASP.NET verwendet intern URLs mit .axd-Erweiterungen (ScriptResource.axd und WebResource.axd), die von einem HttpHandler verarbeitet werden.

Daher sollten Sie diese Regel beibehalten, um zu verhindern, dass ASP.NET MVC versucht, die Anforderung zu verarbeiten, anstatt dies vom dedizierten HttpHandler ausführen zu lassen.

Roy Dictus
quelle
5
Ich bin mir ziemlich sicher, dass Sie möchten, dass die Leute die "Axd-Dateien" auf Ihrer Website herunterladen können, da sie Javascript und Stile enthalten.
Moulde
3
Diese Antwort ist falsch. Der Grund für IgnoreRoutedie Routing-Konfiguration von MVC besteht darin, sicherzustellen, dass MVC nicht versucht, die Anforderung zu verarbeiten. Dies liegt daran, dass .axdEndpunkte von einem anderen HTTP-Handler (einem Handler, der nicht Teil von MVC ist) behandelt werden müssen, um Skripts bereitzustellen.
NightOwl888
1
Ist dies in .NET Core völlig unnötig? Ich habe ungefähr eine Stunde lang bei Google gesucht und kann keine Referenzen für die entsprechenden Schritte finden. Daher gehe ich davon aus, dass dies einfach nicht erforderlich ist.
Dinerdo
35

Einige Hintergrundinformationen

Wenn Sie diese Datei öffnen:

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

Sie finden dies in der Datei:

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

Das sagt der Asp.NET-Laufzeit im Grunde: "Hey asp.net-Typ, wenn eine Anforderung für WebResource.axd eingeht, verwenden Sie AssemblyResourceLoader, um die Anforderung zu verarbeiten."

Bitte beachten Sie, dass WebResource.axd KEINE Datei ist, sondern lediglich eine Zuordnung (wenn ich sagen darf) zu AssemblyResourceLoader. Dies ist der Name, unter dem der Handler registriert ist. Auf meinem Computer habe ich die folgenden .axd-Handler gefunden:

<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, was macht dieser Handler?

Sie AssemblyResourceLoaderwissen, wie man in einer Assembly nach eingebetteten Dateien sucht, damit diese bereitgestellt werden können (senden Sie sie an den Client, dh an einen Browser). Wenn Sie beispielsweise in asp.net-Webformularen die Validierungssteuerelemente verwenden, hängen diese von Javascript ab, um die Fehler auf der Webseite anzuzeigen. Dieses Javascript ist jedoch in eine Assembly eingebettet. Der Browser benötigt das Javascript, damit Sie dies im HTML-Code der Seite sehen können:

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

Sie AssemblyResourceLoaderfinden die Assembly, in die das Javascript eingebettet ist, anhand der Informationen im Querystring und geben das Javascript zurück.


Zurück zur Frage

Um die Frage zu beantworten, was ist:

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

Dies bedeutet für die Routing-Engine, dass wir die Anforderungen, die diesem Routenmuster entsprechen, nicht verarbeiten werden. Mit anderen Worten, wir werden keine .axdAnfragen bearbeiten. Warum? Weil MVC selbst ein HttpHandler ist, der .axdund .aspxvielen anderen Handlern in der Datei web.config ähnlich ist . Der MVC-Handler weiß nicht, wie die Anforderung verarbeitet werden soll, z. B. das Suchen nach eingebetteten Ressourcen in einer Assembly. Er AssemblyResourceLoaderweiß, wie dies zu tun ist. MVC weiß, wie es geht, und alles, was es tut, geht über den Rahmen dieser Frage und Antwort hinaus.

Codierung von Yoshi
quelle
2
Dies sollte auf jeden Fall die akzeptierte Antwort sein, plus eine von mir.
Yahya
Abschließend eine klare Erklärung, was WebResource.axd tatsächlich tut, und eine klare Antwort auf die Frage. Vielen Dank
ben_mj
18

Die Route mit dem Muster {resource} .axd / {* pathInfo} ist enthalten, um zu verhindern, dass Anforderungen für Webressourcendateien wie WebResource.axd oder ScriptResource.axd an einen Controller übergeben werden.

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

Sie können auch festlegen, dass das Routing bestimmte URL-Anforderungen nicht verarbeiten soll. Sie verhindern, dass das Routing bestimmte Anforderungen verarbeitet, indem Sie eine Route definieren und angeben , dass die StopRoutingHandler- Klasse zur Verarbeitung dieses Musters verwendet werden soll. Wenn eine Anforderung von einem StopRoutingHandler- Objekt verarbeitet wird, blockiert das StopRoutingHandler- Objekt jede zusätzliche Verarbeitung der Anforderung als Route. Stattdessen wird die Anforderung als ASP.NET-Seite, Webdienst oder anderer ASP.NET-Endpunkt verarbeitet. Mit der RouteCollection.Ignore- Methode (oder RouteCollectionExtensions.IgnoreRoute für MVC-Anwendungen) können Sie Routen erstellen, die die StopRoutingHandler- Klasse verwenden.

Kumar Manish
quelle
7

Dies sind keine Dateien (sie existieren nicht auf der Festplatte) - es sind nur Namen, unter denen einige HTTP-Handler registriert sind.

Kumar Manish
quelle
relevanteste Antwort würde ich sagen.
Sakthivel