2009-05-14 14 views
12

No sé si es relevante que esto esté sucediendo en un sitio web de MVC, pero pensé que lo mencionaría de todos modos.HttpHandler personalizado no se activa, devolviendo 404 en ASP.NET MVC Application

En mi web.config que tienen estas líneas:

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

en el proyecto de sitio web que tiene una carpeta denominada Los manipuladores que contiene mi clase ImageHandler. Parece que este (He quitado el código 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; } 
     } 
    } 
} 

Si funciono mi sitio web y vaya a /something.imu simplemente devuelve un error 404.

Estoy usando Visual Studio 2008 e intento ejecutar esto en el servidor de desarrollo ASP.Net.

He estado buscando varias horas y lo he estado trabajando en un sitio web vacío por separado. Entonces no entiendo por qué no funcionará dentro de un sitio web existente. No hay otras referencias al camino * .imu por cierto.

Respuesta

32

Sospecho que esto tiene todo que ver con el hecho de que está utilizando MVC, ya que básicamente toma el control de todas las solicitudes entrantes.

Sospecho que tendrá que usar la tabla de enrutamiento y posiblemente crear un nuevo manejador de enrutamiento. No he hecho esto por mí mismo, pero algo como esto podría funcionar:

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

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

y luego la clase ImageRouteHandler a continuación, volver a su costumbre ImageHttpHandler, aunque al mirar ejemplos en la web que podría ser mejor para cambiar eso por lo que implementa MvcHandler, en lugar de IHttpHandler recto.

Edición 1: De acuerdo con el comentario de Pedro, también se puede ignorar la extensión utilizando el método IgnoreRoute:

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

Whoa agradable, que me puso en la dirección correcta! Agregué esta línea en el método RegisterRoutes que evitará que MVC maneje la solicitud: routes.IgnoreRoute ("{resource} .imu/{* pathInfo}"); – Peter

+1

si desea ignorar la extensión en todas las rutas use routes.IgnoreRoute ("{* allimu}", nuevo {allimu = @ ". * \. Imu (/.*)?"}); de phill haack http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx/ – jsturtevant

Cuestiones relacionadas