Подтвердить что ты не робот

Пользовательский HttpHandler не запускается, возвращая 404 в приложении ASP.NET MVC

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

В моем web.config у меня есть следующие строки:

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

в проекте веб-сайта У меня есть папка с именем Handlers, которая содержит мой класс ImageHandler. Это выглядит так (я удалил код 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; }
        }
    }
}

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

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

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

4b9b3361

Ответ 1

Я подозреваю, что это связано с тем, что вы используете 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}");
}