2009-05-14 13 views
12

Non so se è rilevante che ciò accada in un sito Web MVC ma ho pensato di parlarne comunque.HttpHandler personalizzato non si attiva, restituendo 404 in ASP.NET Applicazione MVC

Nel mio web.config devo queste righe:

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

nel progetto Sito Ho una cartella di nome gestori che contiene la mia classe ImageHandler. Sembra che questo (ho rimosso il codice ProcessRequest)

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; } 
     } 
    } 
} 

Se eseguo il mio sito web e vado a /something.imu solo restituisce un errore 404.

Sto utilizzando Visual Studio 2008 e sto provando a eseguirlo sul server di sviluppo ASP.Net.

Ho cercato per diverse ore e ha funzionato in un sito Web vuoto separato. Quindi non capisco perché non funzionerà all'interno di un sito web esistente. Non ci sono altri riferimenti al percorso * .imu btw.

risposta

32

Ho il sospetto che tutto ciò abbia a che fare con il fatto che si sta utilizzando MVC, in quanto sostanzialmente prende il controllo di tutte le richieste in arrivo.

Sospetto che sarà necessario utilizzare la tabella di routing e possibilmente creare un nuovo gestore di routing. Non ho fatto io stesso, ma qualcosa di simile potrebbe funzionare:

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

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

e poi la classe ImageRouteHandler poi tornare la vostra abitudine ImageHttpHandler, anche se dal guardare esempi sul web potrebbe essere meglio cambiare che così implementa MvcHandler, piuttosto che dritto IHttpHandler.

Edit 1: Come per il commento di Peter, si può anche ignorare l'estensione utilizzando il metodo IgnoreRoute:

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

Whoa bello, che mi ha messo nella giusta direzione! Ho aggiunto questa riga nel metodo RegisterRoutes che impedirà a MVC di gestire la richiesta: routes.IgnoreRoute ("{resource} .imu/{* pathInfo}"); – Peter

+1

se si desidera ignorare l'estensione in tutti i percorsi, utilizzare route.IgnoreRoute ("{* allimu}", new {allimu = @ ". * \. Imu (/.*)?"}); da phack haack http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx/ – jsturtevant

Problemi correlati