2011-08-22 13 views
7

Domyślny szablon ASP.NET MVC 3 Projekt zawiera następujące IgnoreRoute dyrektywy:Jaka jest różnica między tymi dwiema dyrektywami IgnoreRoute ASP.NET MVC?

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

Mam teraz widział wiele projektów zmienić tę linię (łącznie StackExchange's DataExplorer) zamiast coś, co wygląda następująco:

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"}); 

Czy ktokolwiek mógłby wyjaśnić, , w jakim scenariuszu lub ogólnie dlaczego domyślne ignorowanie trasy nie byłoby wystarczające, podczas gdy ta druga wersja byłaby? Lub odwrotnie, dlaczego ktoś nie zdecyduje się na używanie tej ostatniej wersji, a zamiast tego pozostanie przy domyślnej?

Muszę przyznać, że nie w pełni rozumiem składnię IgnoreRoute, a MSDN documentation on the subject jest dość lakoniczny.

+0

W przypadku ktoś dzieje się natknąć to w przyszłości, MS ma jakąś przyzwoitą dokumentację o routingu w ASP.NET dostępny [tutaj] (http://msdn.microsoft.com/en-us/library/cc668201 (v = VS.100) .aspx). W szczególności sprawdź sekcję ** Wzorce URL **, które dotyczą funkcji takich jak MapRoute, IgnoreRoute itp. –

Odpowiedz

6

Jest wyjaśnienie w blogu Phila HAACK za: Make Routing Ignore Requests For A File Extension

Podstawową ideą, cytując Phila, to:

Jednym z rozwiązań tego problemu jest dodanie odpowiedniego zignorować drogę do wskazania, że ​​trasy powinny ignorować te upraszanie. Niestety, nie możemy zrobić coś takiego:

{*path}.aspx/{*pathinfo} 

Dopuszczamy tylko jeden catch-all trasy i musi się zdarzyć na końcu adresu URL. Możesz jednak zastosować następujące podejście ...

To, co tu robię, to technika, którą pokazał mi Eilon, który ma odwzorować wszystkie adresy URL na te trasy, a następnie ograniczyć, które trasy należy zignorować za pomocą słownika ograniczeń. Tak więc w tym przypadku te trasy będą pasować (i zignorować) wszystkie żądania dotyczące favicon.ico (bez względu na to, który katalog), a także żądania dotyczące pliku .aspx. Ponieważ powiedzieliśmy routingowi, aby zignorować te żądania, nastąpi normalne przetwarzanie tych żądań przez ASP.NET.

3

Różnica pomiędzy tymi dwoma IgnoreRoute połączeń z oryginalnego postu jest następujący:

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

ten będzie pasował do żądania zasobów jak /ScriptManager.axd lub /Foo.axd/bar/ baz.aspx, ale będzie nie pasuje do dowolnego zasobu o nazwie * .axd poniżej katalogu głównego witryny, na przykład /foo/bar/Baz.axd.

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"}); 

toll używa wyrażenia regularnego, aby dopasować żądanie każdej * .axd zasobu, na każdym poziomie swojej stronie, takich jak /foo/bar/Baz.axd. W związku z tym to wywołanie będzie lepsze niż pierwsze, jeśli odwołasz się do jakichkolwiek zasobów osiowych poniżej katalogu głównego Twojej witryny.

Jeśli rozbić wyrażenie regularne, .* na początku będzie pasował do 0 lub więcej charakteru. \.axd będzie pasować do literalnego ciągu znaków ".axd", a (/.*)? będzie opcjonalnie dopasować ukośnik, po którym następuje 0 lub więcej dowolnych znaków.

Wzorzec adresu URL * w adresie zapewnia skanowanie całej ścieżki, a nie tylko jednego odcinka ścieżki. allaxd jest po prostu etykietą arbtrarną nadaną dopasowanej części ścieżki, która w tym przypadku będzie całą ścieżką. Ta metoda ignorowania tras skutecznie pozwala ignorować trasy dla określonych rozszerzeń plików. Możesz łatwo skopiować to połączenie i wprowadzić kilka zmian, aby zignorować trasy dla * .aspx, * .asmx, itp., Itp.

Aby uzyskać szczegółową dokumentację dotyczącą routingu, bardzo polecam the following MSDN page.

Powiązane problemy