2011-01-13 3 views
9

So habe ich eine Strecke wie diese in meiner MVC 3-Anwendung unter IIS 7:MVC Routing, wenn eine Datei existiert tatsächlich an der angegebenen Stelle

routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 

Der Trick besteht darin, dass eine Datei tatsächlich existiert bei/Virtual/Konfig.xml. Es scheint, als ob die Anfrage nur die XML-Datei an diesem Ort zurückgibt, anstatt die Route zu treffen, die das XML verarbeitet, einige Änderungen vornimmt und ein benutzerdefiniertes XmlResult zurückgibt.

Irgendwelche Vorschläge, wie ich meiner Anwendung sagen kann, die Route zu treffen und nicht die eigentliche Datei für den Fall, dass die Datei auf der Festplatte existiert?

EDIT: Es scheint, dass ich routes.RouteExistingFiles = true; im RegisterRoutes Methode der Global.asax der Anwendung sagen, können Sie Dateien auf der Festplatte zu ignorieren. Dies setzt jedoch das Flag global und bricht viele andere Anforderungen innerhalb der Anwendung. Zum Beispiel möchte ich immer noch Aufrufe von /assets/css/site.css, um die CSS-Datei zurückzugeben, ohne Routen für jedes statische Asset spezifisch festlegen zu müssen. Jetzt stellt sich die Frage: Gibt es eine Möglichkeit, dies pro Strecke zu tun?

+3

Ich glaube nicht, dass es eine einfache Möglichkeit, dies zu erreichen. Warum verschiebst du die statische Datei nicht einfach in den Ordner "~/App_Data"? –

Antwort

6

Bis jetzt die beste Antwort zu dieser, die ich gefunden habe, ist, routes.RouteExistingFiles=true global anzuwenden und dann selektiv die Wege zu ignorieren, die ich zu den vorhandenen Akten wie .js, .css, etc. durchgehen möchte. So endete ich mit etwas wie dies:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("*.js|css|swf"); 
      routes.RouteExistingFiles = true; 

      routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 
} 

Wenn jemand eine bessere Lösung hat, würde Ich mag es zu sehen. Ich würde es vorziehen, selektiv eine "RouteExistingFelles" -Flag auf einzelne Routen anzuwenden, aber ich weiß nicht, ob es eine Möglichkeit gibt, das zu tun.

0

Keine Lösung hier, nur eine Idee.

können Sie versuchen Lösung zu implementieren, basierend auf Ihrem eigenen VirtualPathProvider, die Ihr eigenes Mapping von Web-Pfaden zur Verfügung stellt Systempfade und verwenden Sie die Standardanbieter für alle Pfade, die Sie kümmern, wollen nicht zu erheben.

0

Eine sehr einfache Lösung, sicher, wenn Sie Scotts Antwort, wäre zum Beispiel betrachten: routes.IgnoreRoute("templates/*.html");, routes.IgnoreRoute("scripts/*.js"); und routes.IgnoreRoute("styles/*.css");.

Dies gibt Ihnen sowohl die Einfachheit der nur die Pfade zur RoutesCollection liefern und vermeidet die Arbeit der Einleitung z. ein VirtualPathProvider.

0

könnten Sie versuchen UrlRewiting zB:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="VirtualTourConfig"> 
      <match url="^virtualtour/config.xml" /> 
      <action type="Rewrite" url="virtualtour/config" /> 
     </rule> 
     </rules> 
    </rewrite> 

NB Ich verwende diese für einen anderen Anwendungsfall (dh eine Winkel App von asp.net MVC dient) - Ich habe nicht geprüft, ob MVC Routing tritt NACH dem URL-Umschreiben auf.

In meinem Fall habe ich eine normale MVC Route (d /Dashboard/ =>DashboardController.Index()), sondern müssen alle relativen Pfade in der Views/Dashboard/Index.cshtml statische Dateien dienen, ohne von MVC Routing verwirrt das heißt /Dashboard/app/app.module.js eine statische Datei dienen müssen. Ich benutze URLRewriting /Dashboard/(.+)-/ng/Dashboard/{R:1} zur Karte wie folgt:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="Dashboard"> 
      <match url="^dashboard/(.+)" /> 
      <action type="Rewrite" url="ng/dashboard/{R:1}" /> 
     </rule> 
     </rules> 
    </rewrite> 
Verwandte Themen