2009-06-26 3 views
1

Lassen Sie mich die Behauptung, dass ich nicht so vertraut bin mit ASP.Net MVC, und ich glaube nicht, dass ich Zeit für dieses Projekt haben, vertraut zu werden und zu wechseln.Erzwingen Sie alle asp.net-Anfragen auf eine einzige Seite?

Ich baue eine Website, wo es nur eine physische Seite gibt, mysite.com/default.aspx. Wenn ein Benutzer zu mysite.com/foo/bar navigiert, möchte ich (irgendwie), dass meine default.aspx diese Anfrage verarbeitet. Ich weiß, es klingt sehr "route"/"Controller" orientiert ... aber gibt es einen Weg, dies zu tun, ohne Voll-Schwein auf MVC zu wechseln?

Auch die Website wird auch statische Bilder und Dinge haben, die ich nicht von meiner Seite serviert werden soll ... so kann die resultierende HTML von mysite.com/foo/bar HTML haben, die eine enthält img-Tag mit einem src von mysite.com/images/foo.gif, also muss ich in der Lage sein, bestimmte Ordner/Dateien/whatnot von der Verarbeitung auszuschließen.

Antwort

4

Worüber Sie sprechen ist URL-Rewriting und ja, eine ASP.Net-Formulare-Anwendung ist dazu in der Lage. Dieser Eintrag scheint die Technik ziemlich gut hier zu erklären:

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

Damit HTTP umschreibt auf Dateien zu arbeiten, die in IIS nicht existieren 6 Sie Wildcard-Mapping implementieren müssen. ASP.Net MVC erliegt das gleiche Problem so, auch wenn Sie nicht ASP.Net MVC mit diesem Artikel ist immer noch relevant:

http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx

Blättern Sie auf die Überschrift: "IIS6 Erweiterung lost URLs "

Wenn Sie herausfinden müssen, wie Sie zum IIS-Eigenschaftsfenster gelangen, scrollen Sie etwas nach oben für einen bestimmten Kontext. Ignorieren Sie einfach den Teil über .mvc-Erweiterungen.

+0

Das funktioniert irgendwie ... aber wie bekomme ich das Modul, um Anfragen nach Dateien abzurufen, die physisch nicht existieren? – Jonas

+0

Es gibt eine Einstellung dafür in IIS, aber ich glaube, dass es eine Verlangsamung verursachen wird, da es erfordert, dass alle Anforderungen von der ASP.Net-ISAPI-DLL verarbeitet werden. Ich bearbeite meinen Beitrag mit einem kurzen Durchlauf. –

0

Sie könnten IIS einrichten, um alle 404 Anfragen auf Ihre Website umzuleiten. Wenn ich mich richtig erinnere, gibt es einen Fehler in IIS 6 (wenn Sie das ausführen), der einen Statuscode 200 zurückgibt, der Ihnen erlaubt, Ihre normale Verarbeitung durchzuführen.

Andernfalls könnten Sie das Tag in Ihrer web.config verwenden, um die Weiterleitung zu behandeln - aber ich denke, dass dies den 404-Fehlercode zurückgeben kann.

Hoffe, dass hilft!

0

Ich glaube, ich habe etwas arbeiten, in IIS7 ... aber es scheint Art spröde:

Ich habe ein Httpmodule, Setup wie folgt aus:

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="ScriptModule" /> 
    <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    <add name="MyRewriteModule" preCondition="managedHandler" type="MyWeb.MyRewriteModule, MyWeb" /> 
</modules> 

und mein Modul hat Code wie folgt :

void context_BeginRequest(object sender, EventArgs e) 
{ 
    HttpApplication app = (HttpApplication)sender; 
    HttpRequest request = app.Context.Request; 
    List<string> ignoreExtensions = new List<string>() { "axd", "gif", "ico" }; 
    if(ignoreExtensions.TrueForAll(s => !request.FilePath.ToLower().EndsWith(s))) 
    app.Context.RewritePath("~/default.aspx", request.Path, request.QueryString.ToString(), true); 
} 

Offensichtlich würde ich diese Liste cachen und erweitern ... aber insgesamt scheint es zu funktionieren. Kann jemand auf offensichtliche Nachteile hinweisen?

0

Ändern Sie einfach Ihre 404-Fehlerseite, um zu default.aspx umzuleiten.

Verwandte Themen