Пользовательский HttpHandler не запускается, возвращая 404 в приложении ASP.NET MVC - PullRequest
12 голосов
/ 14 мая 2009

Я не знаю, уместно ли, чтобы это происходило на веб-сайте MVC, но я все равно упомянул об этом.

В моем файле web.config есть следующие строки:

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

в проекте Website у меня есть папка с именем Handlers, в которой содержится мой класс ImageHandler. Это выглядит так (я удалил код запроса процесса)

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

Если я запускаю свой веб-сайт и захожу в /something.imu, он просто возвращает ошибку 404.

Я использую Visual Studio 2008 и пытаюсь запустить его на сервере разработки ASP.Net.

Я искал несколько часов и работал на отдельном пустом сайте. Поэтому я не понимаю, почему это не будет работать внутри существующего сайта. Других ссылок на путь * .imu, кстати, нет.

1 Ответ

32 голосов
/ 14 мая 2009

Я подозреваю, что это связано с тем, что вы используете MVC, поскольку в основном он контролирует все входящие запросы.

Я подозреваю, что вам придется использовать таблицу маршрутизации и, возможно, создать новый обработчик маршрутизации. Я сам этого не делал, но что-то вроде этого может сработать:

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

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

, а затем класс ImageRouteHandler вернет ваш пользовательский ImageHttpHandler, хотя, посмотрев на примеры в Интернете, было бы лучше изменить его, чтобы он реализовывал MvcHandler, а не прямой IHttpHandler.

Редактировать 1: Согласно комментарию Питера, вы также можете игнорировать расширение, используя метод IgnoreRoute:

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