2016-06-23 2 views
2

ASP.NET MVC 5 응용 프로그램에서 호스팅되는 Angular 2 스파를 개발했습니다./가정/색인 - - 나는 모든 요청이 단일 경로로 가고 싶어 그래서 기본 경로를 제거하고 포괄으로 교체했습니다ASP.NET MVC5 응용 프로그램 전체 경로가 무시됩니다.

routes.MapRoute(
    name: "spa-catch-all", 
    url: "{*anything}", 
    defaults: new { controller = "Home", action = "Index" }); 

이것은 RouteConfig.cs에서 유일한 경로이다 파일.

나는 다음과 같이 서버 URL 과거 어떤 경로 값없이 내 응용 프로그램에 충돌하는 경우 :
http://myserver.org/ 

그런 다음 모든 작동합니다. 나는이 같은 URL 공격을 시도하는 경우 :

http://myserver.org/sectionname 

응용 프로그램은 내가 시도하고이를 진단 필 Haack의 경로 디버거 NuGet 패키지를 설치 한 (404)

을 반환을, 디버거는 내게 말하고있다 제거한 asp.net 기본 경로가 내 URL과 일치합니다. 사실, 적어도 catch-all 경로를 보지 못했습니다. 디버거가 생성 한 "All Routes"테이블에서 {* anything} 대신 {* catchall}을 보여줍니다.

MVC가 내 RouteConfig 파일을 무시하는 것처럼 보입니다.

  • 아이디어가 있습니까?
  • 기본 경로가 웹 응용 프로그램 자체 외부에 정의 된 것으로 생각하지 않았습니다. 내 경로 테이블을 정리해야합니까?
  • RouteConfig를 변경하기 전에 어딘가에서 초기 빌드 중 하나에서 캐시 될 수 있습니까?

업데이트 1 :

여기에 전체 RouteConfig.cs 파일입니다 : 공공 정적 무효 RegisterRoutes (RouteCollection 경로) 나는 다음을 지적해야합니까

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

      routes.MapRoute(
       name: "spa-catch-all", 
       url: "{*anything}", 
       defaults: new { controller = "Home", action = "Index" }); 
     } 
    } 
} 

가.

  • 이 프로젝트는 ASP.NET 4.6.1에서 실행되는
  • 내가 프로젝트에 언제 어디서나 OWIN 구성이없는
  • (이 프로젝트의 외부 처리)이 프로젝트에는 인증이 (없다
  • 더 startup.cs, 아니 startup.auth.cs 등)

업데이트 2 : 절망의 행위에

, 내가 가본와 두 개의 새로운 제어 방식을 추가 기본 경로와 일치하는 ollers - 우리는 "Path1"과 "Path2"라고 부르며 기본 컨트롤러 ({controller}/{action}/{id})와 일치합니다.이 경로는 DARN ROUTECONFIG FILE ANYMORE가 아니지만 MVC 아직도 일치에 INSISTS. 이것은 기본 케이스 (http://myapp/path1http://myapp/path2)에서 작동하지만 서브 패스 (http://myapp/path1/subpath1)에서는 여전히 작동하지 않습니다.

나는 내 경로 구성이 완전히 무시되고 있는지 (이유는 모르겠 음) 또는 내 경로의 모든 매개 변수가 예상대로 작동하지 않는다고 판단했습니다. global.asax.cs 파일과 아래의 routeconfig.cs 파일을 첨부합니다 (현재 그대로).

using System; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace MyNamespace 
{ 
    public class Global : HttpApplication 
    { 
     void Application_Start(object sender, EventArgs e) 
     { 
      // Code that runs on application startup 
      AreaRegistration.RegisterAllAreas(); 
      GlobalConfiguration.Configure(WebApiConfig.Register); 
      RouteConfig.RegisterRoutes(RouteTable.Routes);    
     } 
    } 
} 


using System.Web.Mvc; 
using System.Web.Routing; 

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

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

나는 아이디어가 없으며 모든 사람의 의견을 듣고 싶습니다.

업데이트 3 : 더 절망의 행위에

는, 나는 사용자 지정 경로 처리기를 구현 갔어요. 이 시점에서 작동하는지 상관하지 않습니다. 나는 요청할 때 중단 점에 도달하기 만하면됩니다.

저는 "SpaRouteHandler"라는 아주 간단한 핸들러를 만들었습니다.이 핸들러는 창조적으로 SpaHandler라고하는 내 사용자 정의 HttpHandler를 반환합니다. 현재 SpaHandler는 아무 것도하지 않습니다. 단지 예외를 던집니다. 나는 그 놈이 맞았다는 것을 확인하고 싶다. 예외가 히트 결코 극복

using System; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace MyNamespace 
{ 
    public class Global : HttpApplication 
    { 
     void Application_Start(object sender, EventArgs e) 
     { 
      // Code that runs on application startup 
      AreaRegistration.RegisterAllAreas(); 
      GlobalConfiguration.Configure(WebApiConfig.Register); 
      RouteConfig.RegisterRoutes(RouteTable.Routes);    
     } 
    } 
} 



using System.Web.Mvc; 
using System.Web.Routing; 

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

      RouteValueDictionary defaults = new RouteValueDictionary {{"controller", "Home"}, {"action", "Index"}}; 
      var customRoute = new Route("{*.}", defaults, new SpaRouteHandler()); 
      routes.Add(customRoute); 
     } 
    } 
} 



using System.Web; 
using System.Web.Routing; 

namespace MyNamespace 
{ 
    public class SpaRouteHandler : IRouteHandler 
    { 
     public IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      return new SpaHandler(requestContext); 
     } 
    } 
} 



using System; 
using System.Net; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace MyNamespace 
{ 
    public class SpaHandler : IHttpHandler 
    { 
     public RequestContext LocalRequestContext { get; set; } 

     public SpaHandler(RequestContext requestContext) 
     { 
      LocalRequestContext = requestContext; 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 

     public void ProcessRequest(HttpContext context) 
     { 
      throw new NotImplementedException("Just throw an error please"); 
     } 
    } 
} 

:

여기 내 코드의 최신 화신이다. 구성에없는 기존의 기본 경로가 여전히 작동하는 것처럼 보입니다.

여기 내가 잘못하고있는 것은 무엇입니까?!?!?!?!?

+0

당신의'RouteConfig.cs' 파일을 보여주세요. – Nkosi

+0

위에서 추가 할 것입니다. – SyracuseCheer

답변

1

, 이것은 이상한 일이었다. 프로젝트가 처음 만들어 졌을 때부터 웹 애플리케이션의 네임 스페이스를 변경했고 ReSharper의 조정 된 네임 스페이스 리팩토링 도구를 사용하여 프로젝트 전체에서 네임 스페이스를 조정했습니다. 그러나 어떤 이유로 든 global.asax 파일의 <Application /> 태그의 Inherits="" 특성에서 네임 스페이스 참조가 변경되지 않았습니다. DLL의 이전 버전을 참조하기 때문에 Application_Start가 호출되지 않았습니다.

일단 참조를 변경하면 모든 것이 계획대로 작동하기 시작했습니다.

+0

과거에 이것을 해 줘서 +1해야했습니다. –

0

이 시도 : 그것을 알고 보니

app.UseMvc(routes => 
    { 
     routes.MapRoute(name:"default", template:"{controller=Default}/{action=Index}/{id?}"); 

     routes.MapRoute("CatchAll", "{*url}", new {controller = "Default", action = "Index"}); 
    }); 
+0

이 솔루션은 MVC 5 또는 ASP.NET Core MVC 용입니까? – SyracuseCheer

+0

그것은 MVC5 용이지만 두 가지 모두 작동한다고 가정합니다. – AngJobs

+0

또한 기본 경로가 필요하지 않습니다. 제 경우에는 제 범례가 기본 경로입니다. – SyracuseCheer