2012-12-16 10 views
11

Próbuję zrozumieć, jak działa RouteExistingFiles. Stworzyłem nowy projekt internetowy MVC 3 (MVC 4 zachowuje się w ten sam sposób) i umieść plik HTMLPage.html w folderze Treść mojego projektu. Teraz poszłam do pliku Global.asax i edytowane funkcję RegisterRoutes więc wygląda to tak:ASP.NET MVC 3: RouteExistingFiles = true wydaje się nie mieć żadnego efektu

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = true; //Look for routes before looking if a static file exists 

    routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults 
      ); 
    } 

Teraz powinien dać mi błąd, gdy jestem z prośbą o localhost: XXXX/Content/HTMLPage.html ponieważ nie ma kontrolera "Treść", a żądanie zdecydowanie uderza w domyślny wzorzec. Ale zamiast tego widzę moją stronę HTML. Co ja tu robię źle?

Aktualizacja: Myślę, że będę musiał zrezygnować. Nawet jeśli Dodaję trasą jak ten:

routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"}); 

nadal pokazuje mi zawartość HTMLPage. Gdy żądam adresu URL, takiego jak ~/Content/HTMLPage, uzyskuję stronę indeksu zgodnie z oczekiwaniami, ale kiedy dodaję rozszerzenie plików takie jak .html lub .txt wyświetlana jest zawartość (lub błąd 404, jeśli plik nie istnieje). Jeśli ktokolwiek może to sprawdzić w VS2012, proszę dać mi znać, jaki masz wynik. Dziękuję.

Odpowiedz

5

Numer RouteExistingFiles nie pozwala na przeglądanie plików, jeśli nie ma dla nich trasy, sprawdza tylko trasy przed sprawdzeniem, czy plik istnieje. Jeśli nie ma pasującej trasy, nadal będzie sprawdzać, czy jest pasujący plik.

+0

Trasa domyślna z wzorcem "{kontroler}/{akcja}/{id}" wygląda na dobrego kandydata do żądania ~/Content/HTMLPage.html. Tak więc istnieje pasująca trasa. –

+0

@OleksandrKaplun: To pasuje tylko, jeśli faktycznie masz kontroler o nazwie "Treść" i metodę działania w tym kontrolerze o nazwie "HTMLPage.html". – Guffa

+0

Brzmi przekonująco, ale nadal nie działa. Oto, co dodałem do mojej funkcji RegisterRoutes: 'routes.MapRoute ( " ExactMatch ", " Content/HTMLPage.html ", nowy {controller =" Strona główna ", akcja =" Informacje "}}); '. Wciąż pokazuje mi zawartość strony html. P.S. Rozumiem, że powinno działać tak (instrukcja mówi, że powinna), ale tak nie jest, więc domyślam się, że to coś, co zrobiłem źle. Testuję lokalnie na VS2012 i Windows 7. –

5

Visual Studio 2012 używa IIS Express. Musisz poinformować IIS, aby nie przechwytywał żądań dla plików dysków przed ich przekazaniem do systemu routingu MVC. Trzeba ustawić preCondition atrybut pusty ciąg w pliku konfiguracyjnym:

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" 
    preCondition="" /> 

W Win7/8 można znaleźć plik konfiguracyjny na tej ścieżce: %userprofile%\Documents\IISExpress\config\applicationhost.config

+0

To działało dla mnie, dziękuję, ale zakładam, że nie można go skonfigurować na rozwiązanie? – Savage

+0

Możesz dodać przed dodaniem tego modułu. Zobacz https://svenaelterman.wordpress.com/2011/01/31/using-asp-net-4-0-extension-less-routing-on-iis-7-5/ – XPD

16

celu umożliwienia routingu dla plików statycznych, należy wykonać następujące kroki.

W RouteConfig.cs włączyć routing dla istniejących plików

routes.RouteExistingFiles = true; 

dodać trasę na swojej drodze (upewnij się, specjalizującą ścieżki są powyżej ogólnych ścieżek)

routes.MapRoute(
      name: "staticFileRoute", 
      url: "Public/{file}/", 
      defaults: new { controller = "Home", action = "SomeAction" } 
     ); 

Następny skonfigurować aplikację tak, aby zapytanie o pliki statyczne przekazywane są za pomocą "TransferRequestHandler". W Webconfig w ramach system.webServer> handlery dodaj następujący wpis.

<add name="MyCustomUrlHandler2" path="Public/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

Wartość "ścieżka" może być bardziej ogólna lub specyficzna w zależności od wymagań. Ale wolę, żeby zawsze była bardzo specyficzna, jak na swoją potrzebę. Utrzymanie go w sposób bardzo ogólny spowoduje zablokowanie wyświetlania innych zasobów określonych dla witryny, takich jak pliki .js lub css. Na przykład, jeśli powyższe ustawienie zostanie ustawione jako ścieżka = "*", żądanie nawet css (w folderze treści), które jest odpowiedzialne za to, jak wyglądała twoja strona, będzie również kończyło się działaniem kontrolera. Coś, czego nie lubisz.

Powiązane problemy