Пользовательский 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 нет.
Ответы
Ответ 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}");
}