2013-06-27 2 views
1

MVC4의 RouteConfig 클래스를 조금 어지럽히고 왜 이상한 행동을했는지 모릅니다.ASP에서 라우팅 할 때의 이상한 동작 MVC

나는 클래스에 다음 코드를 가지고 :

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

    routes.Add("Favicon", new Route("favicon.ico", new FavIconFileHandler())); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 


} 

아이디어는 누군가가 다른 파일이 사용 된 하위 도메인의 따라 제공 될 것 http://my.domain.com/favicon.ico에 액세스 할 때이다. 예를 들어 http://app1.domain.comhttp://app2.domain.com과 다른 값을 갖습니다. IISRewrite를 사용하여이 작업을 수행 할 수 있음을 알고 있지만 문제를 해결하기 위해이 경로를 탐색하려고합니다.

코드는 여기에 실제로 작동

는 문제는 내가 MVC의 모든 양식을 제출할 때 지금 나는 다음과 같은 URL 얻을 수 있습니다 : 어떤 이유는 왜 이런 일이 일어나고 대신

http://localhost:13424/Home/ShowResult 

http://localhost:13424/favicon.ico?action=ShowResult&controller=Home 

을 favicon.ico가 URL에 추가되는 이유는 무엇입니까?

답변

1

web.config 처리기 섹션에 처리기를 추가 한 다음 경로 매핑에서 처리기를 무시하는 것이 좋습니다.

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

    routes.Add("Favicon", new CustomRoute("favicon.ico", new FavIconFileHandler())); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 


} 

CustomRoute 클래스 :

public class CustomRoute : Route 
    { 
     public CustomRoute(string uri, IRouteHandler handler) : base(uri, handler) 
     { 
     } 

     public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
     { 
      return null; 
     } 
    } 

때문에 작동하지만 당신은 당신의 솔루션을 이동하려면 사용자 정의 경로 클래스와 여기 ovveride GetVirtualPath 방법을 작성해야하는 경로를 등록하는 샘플 코드는 ASP.NET MVC는 동작 링크를 생성 할 때 등록 된 모든 경로에 대해 VirtualPathData를 호출하고 경로가 null을 반환하면 URL 생성을 위해이 경로가 고려되지 않습니다.

public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
{ 
    requestContext = this.GetRequestContext(requestContext); 
    using (this.GetReadLock()) 
    { 
     foreach (RouteBase current in this) 
     { 
      VirtualPathData virtualPath = current.GetVirtualPath(requestContext, values); 
      if (virtualPath != null) 
      { 
       virtualPath.VirtualPath = RouteCollection.GetUrlWithApplicationPath(requestContext, virtualPath.VirtualPath); 
       return virtualPath; 
      } 
     } 
    } 
    return null; 
} 
: 여기

는 VirtualPathData의 결과를 확인하여 MVC에서 코드
1

활성화 된 RouteDebugging을 사용하여이 동작을 디버깅 할 수 있습니다.

이 기본 경로 처리기 경로 테이블의 바닥에 있는지, 확인

<add key="RouteDebugger:Enabled" value="true" /> 블록 <appSettings>에서 :와

수정의 Web.config.

관련 문제