2012-12-16 4 views
11

Ich versuche zu verstehen, wie RouteExistingFiles funktioniert. Also habe ich ein neues MVC 3 Internet-Projekt erstellt (MVC 4 verhält sich auf die gleiche Weise) und eine HTMLPage.html Datei in den Ordner Inhalt meines Projekts einfügen. Nun ging ich in die Datei Global.asax und bearbeitet die RegisterRoutes Funktion, so dass es wie folgt aussieht:ASP.NET MVC 3: RouteExistingFiles = True scheint keine Wirkung zu haben

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 
      ); 
    } 

Nun sollte es mir einen Fehler, wenn ich einen localhost bin anfordernden: XXXX/Content/HTMLPage.html Da es keinen "Content" -Controller gibt und die Anfrage definitiv das Standardmuster trifft. Aber stattdessen sehe ich meine HTML-Seite. Was mache ich hier falsch?

Update: Ich denke, ich muss aufgeben. Auch wenn ich hinzufüge, eine Route wie diese:

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

es zeigt mir immer noch den Inhalt des Htmlpage. Wenn ich eine URL wie ~/Content/HTMLPage anfordere, erhalte ich die Indexseite wie erwartet, aber wenn ich eine Dateierweiterung wie .html oder .txt hinzufüge, wird der Inhalt angezeigt (oder ein Fehler 404, wenn die Datei nicht existiert). Wenn jemand dies in VS2012 überprüfen kann, lassen Sie mich bitte wissen, welches Ergebnis Sie erhalten. Danke.

Antwort

5

Die Datei RouteExistingFiles verhindert, dass Dateien angezeigt werden, wenn für sie keine Route vorhanden ist. Sie prüft nur die Routen, bevor überprüft wird, ob die Datei vorhanden ist. Wenn keine übereinstimmende Route vorhanden ist, wird weiterhin überprüft, ob eine übereinstimmende Datei vorhanden ist.

+0

Die Standardroute mit dem Muster "{controller}/{aktion}/{id}" sieht wie ein guter Kandidat für die Anforderung ~/Content/HTMLPage.html aus. Also gibt es eine passende Route. –

+0

@OleksandrKaplun: Das passt nur, wenn Sie tatsächlich einen Controller namens "Content" und eine Aktionsmethode in diesem Controller namens "HTMLPage.html" haben. – Guffa

+0

Es klingt überzeugend, funktioniert aber immer noch nicht. Hier ist, was ich oben in meiner RegisterRoutes-Funktion hinzugefügt habe: 'routes.MapRoute ( " ExactMatch ", " Inhalt/HTMLPage.html ", new {controller =" Home ", action =" Über "}); '. Zeigt mir immer noch den Inhalt der HTML-Seite. P.S. Ich verstehe, dass es so funktionieren sollte (das Handbuch sagt, dass es sollte), aber es ist einfach nicht so, ich vermute es ist etwas, was ich falsch gemacht habe. Ich teste lokal auf VS2012 und Windows 7. –

5

Visual Studio 2012 verwendet IIS Express. Sie müssen IIS mitteilen, dass keine Anforderungen für Datenträgerdateien abgefangen werden, bevor sie an das MVC-Routingsystem übergeben werden. Sie müssen festlegen preCondition Attribut auf die leere Zeichenfolge in der Konfigurationsdatei:

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

In Win7/8 Sie config-Datei auf diesem Weg finden: %userprofile%\Documents\IISExpress\config\applicationhost.config

+0

Das hat bei mir funktioniert, danke, aber ich nehme an, dass es nicht pro Lösung konfiguriert werden kann? – Savage

+0

Sie können, indem Sie hinzufügen, bevor Sie dieses Modul hinzufügen. Siehe https://svenaelterman.wordpress.com/2011/01/31/using-asp-net-4-0-extension-less-routing-on-iis-7-5/ – XPD

16

Um das Routing für statische Dateien mit denen Sie folgende Schritte durchführen müssen.

In RouteConfig.cs ermöglichen Routing für vorhandene Dateien

routes.RouteExistingFiles = true; 

eine Route für Ihren Weg hinzufügen (Achten Sie darauf spezialisiert Pfad über generali Pfade)

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

Weiter Ihre Anwendung konfigurieren, so dass Anforderungen für statische Dateien werden von "TransferRequestHandler" behandelt. Fügen Sie in Webconfig unter system.webServer> Handler folgenden Eintrag hinzu.

Der Wert von 'Pfad' kann generischer oder spezifischer sein, abhängig von Ihrer Anforderung. Aber ich bevorzuge es, immer sehr spezifisch zu sein, je nach Bedarf. Wenn es sehr allgemein gehalten wird, wird die Bereitstellung anderer standortspezifischer Ressourcen wie JS- oder CSS-Dateien blockiert. Zum Beispiel, wenn oben als path = "*" gesetzt ist, dann wird auch die CSS (innerhalb des Inhaltsordners), die dafür verantwortlich ist, wie Ihre Seite aussehen würde, in der Aktion Ihres Controllers landen. Etwas, das dir nicht gefallen wird.