1

나는 1000s의 질문과 블로그를 통해 트롤링을 해왔지만 여전히 댐 라우팅을 완전히 이해하지 못했습니다!한 방향으로 .GIF 라우팅, 나머지 MVC 4 사이트 다른 사이트

Scott Hanselman's blog의 줄을 따라 특정 MVC4 사이트가 정상적으로 작동하는 동안 특정 호출을 .GIF로 사용자 지정 HttpHandler로 라우팅하려고합니다. 나는 거기 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의에서 나는 http://mysite.com/analytics/a.gif 경로를 올바르게 이제

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

이런 식으로,이 모든 그러나 내 모든 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

마지막으로 유사한 게시물을 발견 한 후, 나는 그것을 부 .다. 포스트 당신은 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를 추가 할 때 문제가 있었다 처리하기 원하는 파일의 경로를 무시해야 할

why is the httphandler not running이고 Route.Add 나는 404을 얻었다 제거 Routing 엔진이 Handler를 제어하지 못했다고 생각합니다.

1

당신이 필요가있는 무엇을 사용자 정의 Route 클래스를 만드는 것입니다.

이 클래스에서는 경로 데이터를 검사하고 올바른 URL을 생성하는 GetVirtualPath 메서드 (on MSDN)를 재정의해야합니다. 제공되는 RequestContext에 특수 URL이없는 경우 null을 반환하도록 구현하십시오.

귀하의 앱에서 현재 진행중인 것은 RouteValue 사전의 컨트롤러와 동작을 오버플로 매개 변수로 처리하는 표준 Route 클래스를 사용하고있어 작성된 URL에 추가된다는 것입니다.

경로 컬렉션에 경로를 추가 할 때 기본 Route 클래스 대신 사용자 정의 클래스를 사용하십시오.

추가 설명 : Url.Action과 같은 메서드를 사용하여 URL을 만들면 RouteCollection.GetVirtualPath이 호출됩니다. 그리고이 메소드는 Route에 등록 된 GetVirtualPath 중 하나가 null (URL 문자열)과 다른 값을 반환 할 때까지 Route을 호출합니다. 자신의 Route 클래스를 제공하지 않으므로 "표준"Route 클래스가 사용되고 원치 않는 URL이 반환됩니다. 직접 GetVirtualPath 구현을 사용하여 맞춤 Route 클래스를 만든 경우 원하는 URL을 반환합니다.

+0

흠, 이것은 효과가 있을지 모르지만 내가 추구하고 싶은 길이 아니 었습니다. 나는 그것이 HttpHandlers에서 처리 될 수 있다고 확신했다. 미안해. 나는 그것을 시도하지 않았고, 그것을 다른 방법으로 해결했다. – Martyn

+0

어떻게 해결 했습니까? 솔루션을 공유해야하므로 우리 모두가 그것을 볼 수 있고 올바른 것으로 표시 할 수 있습니다 (2 일 후에 수행 할 수있는 작업, 나는 생각합니다). – JotaBe

+0

제가 가지고 있습니다 :) 아래 참조 – Martyn

0

Hanselman의 기사에 따르면 이 아닙니다. 이미지 경로를 추가하려는 경우 web.config에 처리기를 설정하기 만하면됩니다. AnalyticsRoute을 제거하고 작동하는지 확인해 보셨습니까? MVC가 요청을 처리하지 못하게하려면 무시 경로를 추가해야 할 수도 있습니다.

나는 그것을 사용하지 않았지만 Phil Haack이 작성한 RouteMagic은 경로 문제를 해결하는 데 유용하다고 들었습니다.

+0

그게 내가 Hasselmans 기사에서 얻은 것이 아니며, runAllManagedModulesForAllRequests = "false"를 사용하여 주위를 둘러 볼 수 있다고 생각합니다. 인용구 : "HttpHandler는 특정 경로, 파일 또는 와일드 카드를 대상으로하며 HttpModule은 항상보고 있으므로 HttpHandler를 직접 사용하여 web.config 수준에서 플러그인하고 runAllManagedModulesForAllRequests ="false "로 설정하는 것이 좋습니다." 그는 Route와 함께 할 곳을 언급하지 않았습니다 .Add. 나는 그것을 시도하고 제거했지만 404가 붙어 있습니다. 여하튼. – Martyn