Co to jest route.IgnoreRoute („{zasób} .axd / {* pathInfo}”)

95

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

Nie mogę znaleźć żadnego pliku .axd w moim projekcie, czy mogę usunąć tę regułę trasy?

Eric Yin
źródło

Odpowiedzi:

81

Pliki .axd nie istnieją fizycznie. ASP.NET używa adresów URL z rozszerzeniami .axd (ScriptResource.axd i WebResource.axd) wewnętrznie i są obsługiwane przez HttpHandler.

W związku z tym należy zachować tę regułę, aby uniemożliwić ASP.NET MVC próbę obsłużenia żądania zamiast pozwalać na to dedykowanemu HttpHandler.

Roy Dictus
źródło
5
Jestem prawie pewien, że chcesz, aby ludzie mogli pobierać „pliki axd” z Twojej witryny, ponieważ zawierają javascript i style.
Moulde
3
Ta odpowiedź jest nieprawidłowa. Powodem wprowadzenia IgnoreRoutekonfiguracji routingu MVC jest upewnienie się, że MVC nie próbuje obsłużyć żądania. Dzieje się tak, ponieważ .axdpunkty końcowe muszą być obsługiwane przez inną procedurę obsługi HTTP (procedurę, która nie jest częścią MVC), aby obsługiwać skrypty.
NightOwl888
1
Czy jest to całkowicie niepotrzebne w .NET core? Szukałem w Google przez około godzinę i nie mogę znaleźć żadnych odniesień do równoważnych kroków, więc zakładam, że po prostu nie są potrzebne.
Dinerdo
35

Trochę tła

Jeśli otworzysz ten plik:

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

znajdziesz to w pliku:

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

To jest po prostu informacja dla środowiska wykonawczego Asp.NET: „Hej, koleś asp.net, jeśli nadejdzie żądanie dotyczące WebResource.axd, użyj AssemblyResourceLoader do przetworzenia żądania”.

Proszę zauważyć, że WebResource.axd NIE jest plikiem, ale po prostu mapą (jeśli mogę tak powiedzieć) do AssemblyResourceLoader. Jest to nazwa, pod którą zarejestrowany jest przewodnik. Na moim komputerze znalazłem następujące programy obsługi .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, więc co robi ta obsługa?

AssemblyResourceLoaderWie jak szukać osadzonych plików w zespole więc może to służyć (wysyłanie go do klienta czyli przeglądarkę). Na przykład w formularzach internetowych asp.net, jeśli używasz formantów walidacji, zależą one od niektórych skryptów JavaScript, aby pokazać błędy na stronie sieci Web. Jednak ten javascript jest osadzony w zestawie. Przeglądarka potrzebuje javascript, więc zobaczysz to w html strony:

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

AssemblyResourceLoaderZnajdzie zespół, gdzie JavaScript jest osadzony za pomocą informacji w ciągu kwerendy i zwróci JavaScript.


Wracając do pytania

A więc odpowiadając na pytanie, co to jest:

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

To mówi silnikowi routingu, że nie będziemy przetwarzać żądań, które pasują do tego wzorca trasy. Innymi słowy, nie będziemy przetwarzać .axdwniosków. Czemu? Ponieważ sama MVC jest podobna do HttpHandler .axdi .aspxwielu innych teleskopowe, które są w pliku web.config. Procedura obsługi MVC nie wie, jak przetworzyć żądanie, na przykład szuka zasobów osadzonych w zestawie - AssemblyResourceLoaderwie, jak to zrobić. MVC wie, jak to zrobić, cóż, wszystko, co robi, co wykracza poza zakres tego pytania i odpowiedzi.

KodowanieYoshi
źródło
2
To zdecydowanie zdecydowanie powinna być zaakceptowana odpowiedź, plus jedna ode mnie.
Yahya
Na koniec jasne wyjaśnienie tego, co faktycznie robi WebResource.axd, jednocześnie zapewniając jasną odpowiedź na pytanie. Dziękuję
ben_mj
18

Trasa ze wzorcem {zasób} .axd / {* pathInfo} jest dołączona, aby zapobiec przekazywaniu żądań dotyczących plików zasobów sieci Web, takich jak WebResource.axd lub ScriptResource.axd, do kontrolera.

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

Możesz również określić, że routing nie powinien obsługiwać niektórych żądań adresów URL. Uniemożliwiasz routingowi obsługę niektórych żądań, definiując trasę i określając, że do obsługi tego wzorca powinna być używana klasa StopRoutingHandler . Gdy żądanie jest obsługiwane przez obiekt StopRoutingHandler, obiekt StopRoutingHandler blokuje wszelkie dodatkowe przetwarzanie żądania jako trasy. Zamiast tego żądanie jest przetwarzane jako strona ASP.NET, usługa sieci Web lub inny punkt końcowy ASP.NET. Możesz użyć metody RouteCollection.Ignore (lub RouteCollectionExtensions.IgnoreRoute dla aplikacji MVC), aby utworzyć trasy, które używają klasy StopRoutingHandler .

Kumar Manish
źródło
7

To nie są pliki (nie istnieją na dysku) - to tylko nazwy, pod którymi zarejestrowane są niektóre programy obsługi HTTP.

Kumar Manish
źródło
najbardziej trafna odpowiedź, którą powiedziałbym.
Sakthivel