1

Я травляю тысячи вопросов и блогов и до сих пор не полностью понимаю маршрутизацию плотин!Маршрутизация .GIF в одну сторону, остальная часть сайта MVC 4 еще

По строкам Scott Hanselman's blog Я пытаюсь направить определенный вызов в .GIF на пользовательский HttpHandler, в то время как остальная часть сайта MVC4 ведет себя нормально. Я на 90% оттуда.

Так что в моем RouteConfig у меня есть

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.Add("AnalyticsRoute", new Route("analytics/a.gif", new AnalyticsRouteHandler())); 
    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
    routes.RouteExistingFiles = true; 
} 

и в моем web.config у меня есть

<handlers> 
    ... 
    <add name="analytics" verb="*" path="analytics/a.gif" type="Lms.Analytics.AnalyticsHandler, Lms.Analytics" preCondition="managedHandler" /> 
</handlers> 

Теперь этот путь, http://mysite.com/analytics/a.gif маршруты правильно, и все счастливы, но все мои ActionLinks являются разрешаются как http://mysite.com/analytics/a.gif?action=Index&controller=Category

Если я отменил заказ в RouteConfig, то есть

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
    routes.Add("AnalyticsRoute", new Route("analytics/a.gif", new AnalyticsRouteHandler())); 
    routes.RouteExistingFiles = true; 
} 

Все ссылки решаются просто нормально, но звонок в http://mysite.com/analytics/a.gif приводит к ошибке 404?

Должно быть, я делаю что-то глупое и просто не вижу его ?!

Заранее спасибо

ответ

2

После того, как, наконец, наткнувшись на подобный пост, я взломал его. Сообщение было why is the httphandler not running

Вы должны игнорировать путь к файлу вы хотите, чтобы HttpHandler обрабатывать

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("analytics/a.gif"); 
     routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
     routes.RouteExistingFiles = true; 
    } 

Проблема заключалась в том, когда я добавил web.config и удалили Route.Add я получил 404 Я предполагаю, что механизм маршрутизации превысил управляющий.

1

Что вам нужно сделать, это создать свой собственный пользовательский Route класс.

В этом классе вы должны переопределить метод GetVirtualPath (on MSDN), который будет проверять данные маршрута и генерировать правильный Url. Реализуйте его так, чтобы он возвращал null, если ваш специальный URL-адрес не указан в RequestContext.

Что происходит в вашем приложении, так это то, что вы используете стандартный класс Route, который обрабатывает контроллер и действие в словаре RouteValue как параметры переполнения, поэтому они добавляются к созданному URL-адресу.

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

Дополнительные пояснения: при использовании любого метода, такого как Url.Action, для создания Url, вызывается RouteCollection.GetVirtualPath. И этот метод вызывает GetVirtualPath каждого зарегистрированного Route, пока одно из них не вернет значение, отличное от нуля (строка Url). Поскольку вы не предоставляете свой собственный класс Route, используется «стандартный» класс Route и возвращает нежелательный URL. Если вы создадите свой собственный класс Route с вашей собственной реализацией GetVirtualPath, вы вернете нужный URL.

+0

Хм, возможно, это тоже сработало, но это был не путь, который я хотел преследовать. Я был уверен, что это может быть обработано в HttpHandlers. Извините, я не пробовал и решил это по-другому. – Martyn

+0

как вы его решили? Вы должны поделиться своим решением, чтобы мы все это видели, и отмечаем его как правильное (что вы можете сделать через 2 дня, я думаю). – JotaBe

+0

У меня есть :) см. Ниже – Martyn

0

Согласно статье Хензельмана, вы не принимаете не хотите добавить маршрут для своего изображения, просто нужно настроить обработчик в web.config. Вы пытались удалить свой AnalyticsRoute и посмотреть, работает ли он? Вам также может потребоваться добавить маршрут игнорирования, чтобы MVC не пытался обработать запрос.

Я не использовал его, но я слышал, что RouteMagic, написанный Филом Хааком, отлично подходит для устранения проблем с маршрутом.

+0

Это не то, что я получил от статьи Hasselmans, я понял, что вы можете обойтись с помощью runAllManagedModulesForAllRequests = "false". Цитата: «Помните, что HttpHandlers нацелены на определенный путь, файл или подстановочный знак, и HttpModules всегда смотрят. Почему бы не использовать HttpHandler напрямую и подключить его на уровне web.config и установить runAllManagedModulesForAllRequests =« false »?» Он нигде не упоминал, что делать с Route.Add. Я попытался удалить его, но получил только 404. Все равно. – Martyn