2011-01-17 5 views
3

Ich möchte HTTP-Anfragen nicht zu einer Aktion, sondern zu einer Datei.asp.net mvc 2.0: Route Anfrage an statische Ressource

Wichtig: ich habe eine funktionierende Lösung mit IIS 7.0 URL-Modul Umschreiben, aber für das Debuggen zu Hause (keine IIS 7.0) Ich kann nicht URL-Rewriting verwenden.

Spezifische Situation
ich jede URL verweisen soll, die /images/ auf einen ~/images/ Ordner enthält.

Beispiel:

http://wowreforge.com/images/a.png -> /images/a.png 
http://wowreforge.com/Emerald Dream/Jizi/images/a.png -> /images/a.png 
http://wowreforge.com/US/Emerald Dream/Jizi/images/a.png -> /images/a.png 
http://wowreforge.com/characters/view/images/a.png -> /images/a.png 

Das Problem rührt von der Tatsache, dass Seite "view_character.aspx" kann aus mehreren URLs angekommen sein:

http://wowreforge.com/?name=jizi&reaml=Emerald Dream 
http://wowreforge.com/US/Emerald Dream/Jizi 

Context IIS 7.0 (integrierte Modus), ASP.NET MVC 2.0

Extra Credit Fragen

  • Ist es eine schlechte Idee, ASP.NET MVC Routing in dieser Situation zu verwenden anstelle von URL-Rewriting?
  • Welcher Handler leitet IIS 7.0 Anforderungen an physische Dateien weiter?

Antwort

3

Sie sollten wahrscheinlich Ihre Links zu Bildern umschreiben.

<img src="<%= ResolveUrl("~/images/a.png") %>" /> 

So müssen Sie nicht Ihre Routen die Bilder behandeln.

UPDATE Wie würden Sie es tun durch Routing diesen Eintrag hinzufügen, um Ihre Routetable

routes.Add("images", new Route("{*path}", null, 
    new RouteValueDictionary(new { path = ".*/images/.*"}), 
    new ImageRouteHandler())); 

Jetzt benötigen Sie einen ImageRouteHandler erstellen und eine imagehandler

public class ImageRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     //you'll need to figure out how to get the physical path 
     return new ImageHandler(/* get physical path */); 
    } 
} 

public class ImageHandler : IHttpHandler 
{ 
    public string PhysicalPath { get; set; } 

    public ImageHandler(string physicalPath) 
    { 
     PhysicalPath = physicalPath; 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.TransmitFile(PhysicalPath); 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 

Diese doesn auch‘ t kein Caching. Sie können System.Web.StaticFileHandler in Reflector für den Handler auschecken, der statische Dateien für eine Asp.Net-Anwendung für eine vollständigere Implementierung verarbeitet.

+0

es funktioniert nicht, wenn HTML von Javascript generiert wird. Und das Auflösen von URLs in Javascript-Dateien fühlt sich unordentlich an. –

+0

@ user93422 Messier als benutzerdefinierte Route Handler schreiben und Ihre Route Tabelle verschmutzen? – Vadim

+1

definitiv so. Aber ich weiß nicht, wie die Route aussehen wird. Egal, ich würde gerne wissen, wie es durch Routing gemacht wird. –