2012-06-29 6 views
17

Ich habe für ein paar Stunden googlen und basteln und habe nicht wirklich viel Fortschritte gemacht, so dass hoffentlich jemand hier helfen kann.ASP.NET MVC Route: umgehen staticfile Handler für Pfad

Ich versuche, alle Anfragen zu einem bestimmten Pfad von einer Drittanbieter-Komponente behandelt werden.

EDIT Und ich brauche alle Anforderungen an alle anderen Pfade, um normal zu verhalten.

Ich verwende eine Route-Handler mit einem Wildcard-Mapping wie folgt aus:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

Alle traditionellen Routen nach vorne richtig an den Handler, der schön auf die 3rd-Party-Komponente weiterleitet. Wenn ich auf statische Dateien (.html, .txt usw.) stoße, werden sie vom StaticFile-Handler statt von meinem Handler abgeholt. Daher versuche ich, den StaticFile-Handler wie folgt zu deaktivieren (vereinfacht):

<system.webServer> 
    <handlers> 
    <remove name="StaticFile"/> 
    </handlers> 
</system.webServer> 

Dies deaktiviert den StaticFile-Handler, aber MVC nimmt die Route immer noch nicht auf.

Ich würde lieber nicht auf die Erstellung meiner eigenen Handler und injizieren in den ASP-Anfrage-Stack zurückgreifen, da es scheint, dass es eine MVC-glücklich sein sollte, dies zu tun.

Irgendwelche Gedanken? Und danke.

Antwort

14

Hier gibt es ein paar Optionen.

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

Wenn Sie wirklich alle Anfragen wollen durch das asp.net Rohr läuft, dann müssen Sie.

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

aktualisieren

Eine weitere Option, vor allem, wenn Ihre Notwendigkeit, den statischen Handler zu umgehen, um eine Teilmenge von Ihrer Website beschränkt ist, ist die folgende

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

Bedenkt man, wie auf die Verwendung MVC-Sites, die meisten statischen Dateien werden von einem Paar bekannten Verzeichnisse behandelt, das ist eine bessere Option.

+0

Dank. Es ist definitiv etwas, was ich ausprobiert habe, aber ich möchte, dass alle anderen Pfade normal behandelt werden. Es scheint wirklich so zu sein, als gäbe es keinen MVC-Weg, um das zu tun, und ich sollte einfach den Handler vor MVC aufschlüsseln und hinzufügen. – jmoss

+0

Nicht sicher über die Besonderheiten von genau das, was Sie wollen und nicht behandeln möchten, aber ja, um die Dinge in MVC die asp.net-Rohr müssen alle entsprechenden Anfragen erhalten. –

+0

WICHTIGER HINWEIS: '' gilt nur für Anwendungspools, die eine integrierte Modus-Pipeline ausführen. Dies funktioniert nicht für App-Pools, die im klassischen Modus ausgeführt werden. – BenSwayne

2

Die beste Lösung hierfür ist wahrscheinlich eine URL Rewriter zu verwenden, um die Anfragen von der ursprünglichen URL an eine MVC-freundliche Alternative zu übertragen.

Angenommen, Sie müssen in der Lage sein, relative URLs in Inhalten, die von einer Datenbank geliefert werden, automatisch zu laden.

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

Diese Regeln werden Sie MVC Routen einrichten zwei lassen:

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

Und dann der Aktionsmethoden sind einfach:

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

Die erste Rewrite-Regel gibt es Wege zu verhindern, enthält/rel vor dem Umschreiben; Sie sind bereits in ihrer endgültigen Form. Die zweite Rewrite-Regel proxies (statt Umleiten) die Anfrage.

z.B.

/load/1234/file.xml 

wird

/load/1234/rel?path=file.xml 

Vertretung für die Anfrage zu tun, anstatt eine Client-Umleitung verschachtelte relative Pfade ermöglicht als gut zu funktionieren (und versteckt das Geheimnis Sauce vom Endverbraucher.)