2009-05-14 4 views
12

Je ne sais pas si cela se produit dans un site Web MVC, mais je pense que je le mentionnerais de toute façon.HttpHandler personnalisé ne se déclenche pas, renvoyant 404 dans l'application ASP.NET MVC

Dans mon web.config j'ai ces lignes:

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

dans le projet de site Web, j'ai un dossier nommé Handlers qui contient ma classe ImageHandler. Il ressemble à ceci (j'ai supprimé le code 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 je lance mon site et aller à /something.imu il retourne juste une erreur 404. J'utilise Visual Studio 2008 et j'essaie de l'exécuter sur le serveur de développement ASP.Net.

J'ai cherché pendant plusieurs heures et l'ai fait travailler dans un site Web vide séparé. Donc, je ne comprends pas pourquoi cela ne fonctionnera pas à l'intérieur d'un site Web existant. Il n'y a pas d'autres références au chemin * .imu btw.

Répondre

32

Je suppose que cela a tout à voir avec le fait que vous utilisez MVC, car il prend en charge toutes les demandes entrantes.

Je suppose que vous devrez utiliser la table de routage, et éventuellement créer un nouveau gestionnaire de routage. Je ne l'ai pas fait moi-même, mais quelque chose comme ça pourrait fonctionner:

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

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

puis la classe ImageRouteHandler sera alors retourner votre commande ImageHttpHandler, bien que de regarder des exemples sur le web, il pourrait être préférable de changer cela il implémente MvcHandler, plutôt que directement IHttpHandler.

Edit 1: Selon le commentaire de Peter, vous pouvez également ignorer l'extension en utilisant la méthode IgnoreRoute:

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

Whoa belle, qui m'a mis dans la bonne direction! J'ai ajouté cette ligne dans la méthode RegisterRoutes qui empêchera MVC de gérer la requête: routes.IgnoreRoute ("{resource} .imu/{* pathInfo}"); – Peter

+1

si vous voulez ignorer l'extension dans tous les chemins, utilisez routes.IgnoreRoute ("{* allimu}", new {allimu = @ ". * \. Imu (/.*)?"}); de phill haack http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx/ – jsturtevant

Questions connexes