2009-05-14 13 views
12

Ich weiß nicht, ob es relevant ist, dass dies in einer MVC-Website geschieht, aber dachte, ich würde es trotzdem erwähnen.Benutzerdefinierte HttpHandler nicht feuern, 404 zurück in ASP.NET MVC-Anwendung

In meinem web.config habe ich diese Zeilen:

<add verb="*" path="*.imu" type="Website.Handlers.ImageHandler, Website, Version=1.0.0.0, Culture=neutral" /> 

in der Website Projekt, das ich einen Ordner mit dem Namen Handlers haben, die meine imagehandler-Klasse enthält. Es sieht wie folgt aus (ich habe den Code Process entfernt)

using System; 
using System.Globalization; 
using System.IO; 
using System.Web; 

namespace Website.Handlers 
{ 
    public class ImageHandler : IHttpHandler 
    { 
     public virtual void ProcessRequest(HttpContext context) 
     { 
      //the code here never gets fired 
     } 

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

Wenn ich meine Website laufen und gehen Sie /something.imu es nur einen 404-Fehler zurückgibt.

Ich verwende Visual Studio 2008 und versuche, dies auf dem ASP.Net-Entwicklungsserver auszuführen.

Ich habe mehrere Stunden gesucht und hatte es in einer separaten leeren Website arbeiten. Also verstehe ich nicht, warum es in einer bestehenden Website nicht funktionieren wird. Es gibt keine weiteren Verweise auf den Pfad * .imu btw.

Antwort

32

Ich vermute, dass dies alles damit zu tun hat, dass Sie MVC verwenden, da es im Grunde die Kontrolle über alle eingehenden Anfragen übernimmt.

Ich vermute, Sie müssen die Routing-Tabelle verwenden und möglicherweise einen neuen Routing-Handler erstellen. Ich habe das nicht selbst getan, aber so etwas wie dies funktionieren könnte:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Add(new Route 
    (
     "{action}.imu" 
     , new ImageRouteHandler() 
    )); 
} 

und dann die ImageRouteHandler Klasse wird dann wieder Ihre benutzerdefinierte ImageHttpHandler, wenn auch von an Beispielen im Web suchen könnte es besser sein, dass so es zu ändern implementiert MvcHandler, anstatt gerade IHttpHandler.

Edit 1: Richtet sich nach Peters Kommentar, können Sie auch die Erweiterung ignorieren, indem die IgnoreRoute Methode:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.imu/{*pathInfo}"); 
} 
+4

Whoa schön, die mich in die richtige Richtung setzen! Ich habe diese Zeile in der RegisterRoutes-Methode hinzugefügt, die MVC davon abhält, die Anfrage zu bearbeiten: routes.IgnoreRoute ("{resource} .imu/{* pathInfo}"); – Peter

+1

Wenn Sie die Erweiterung in allen Pfaden ignorieren möchten, verwenden Sie routes.IgnoreRoute ("{* allimu}", neu {allimu = @ ". * \. Imu (/.*)?"}); von phill haack http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx/ – jsturtevant

Verwandte Themen