Angular 忽略ASP.NET MVC5应用程序捕获所有路由

Angular 忽略ASP.NET MVC5应用程序捕获所有路由,angular,asp.net-mvc-5,routing,angular2-routing,Angular,Asp.net Mvc 5,Routing,Angular2 Routing,我正在开发一个Angular 2 spa,它将托管在ASP.NET MVC 5应用程序中。我希望每个请求都指向一个路由-/home/index-因此我删除了默认路由,并将其替换为一个catch-all: routes.MapRoute( name: "spa-catch-all", url: "{*anything}", defaults: new { controller = "Home", action = "Index" }); 这是RouteConfig.cs文件中的唯一路

我正在开发一个Angular 2 spa,它将托管在ASP.NET MVC 5应用程序中。我希望每个请求都指向一个路由-/home/index-因此我删除了默认路由,并将其替换为一个catch-all:

routes.MapRoute(
  name: "spa-catch-all",
  url: "{*anything}",
  defaults: new { controller = "Home", action = "Index" });
这是RouteConfig.cs文件中的唯一路由

如果我在没有任何路径值通过服务器URL的情况下点击我的应用程序,如下所示:

http://myserver.org/
http://myserver.org/sectionname
然后一切都开始了。如果我尝试点击如下URL:

http://myserver.org/
http://myserver.org/sectionname
应用程序返回404

我已经安装了Phil Haack的Route Debugger NuGet包来尝试并诊断此问题,调试器告诉我asp.net默认路由(我已删除)与我的url匹配。事实上,我甚至没有看到catch-all路由,至少不像我在调试器生成的“all-Routes”表中定义的那样(它显示的是{*catch-all},而不是{*anywhere})

MVC似乎忽略了我的RouteConfig文件

  • 知道发生了什么事吗
  • 我不认为默认路由是在web应用程序本身之外的任何地方定义的。我需要清除路线表吗
  • 在我更改RouteConfig之前,是否可以缓存我早期构建中的某个地方
更新1:

以下是完整的RouteConfig.cs文件: 公共静态无效注册表项(路由收集路由)

我确实需要指出以下几点

  • 此项目在ASP.NET 4.6.1下运行
  • 此项目中没有身份验证(在此项目之外处理)
  • 我在项目中的任何地方都没有任何OWIN配置(没有startup.cs、没有startup.auth.cs等)
更新2:

在绝望中,我添加了两个新的控制器来匹配默认路由——我们将它们称为“Path1”和“Path2”——以匹配默认控制器({controller}/{action}/{id}),该控制器甚至不在该死的ROUTECONFIG文件中,但MVC仍然坚持匹配。这适用于我的基本情况(
http://myapp/path1
http://myapp/path2
),但它仍然不适用于子路径(
http://myapp/path1/subpath1

我已经确定要么我的路由配置被完全忽略(不知道为什么),要么我的路径中的catch-all参数根本没有按预期工作。我在下面附上global.asax.cs文件和routeconfig.cs文件(如现在所示)

我没有主意了,很想听听大家的建议

更新3:

在进一步的绝望中,我实现了一个自定义路由处理程序。我甚至不在乎它在这一点上是否有效;我只是希望它在我发出请求时命中一个断点

我创建了一个非常简单的处理程序,名为“SparoutHandler”,它返回我的定制HttpHandler,创造性地称为SpaHandler。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");
        }
    }
}
异常永远不会被命中。配置中没有的好的旧默认路由似乎仍然有效

我到底做错了什么

试试这个:

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

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

事实证明,这是一个奇怪的问题。我更改了web应用程序的名称空间,从最初创建项目时开始,并使用ReSharper的调整名称空间重构工具在整个项目中调整名称空间。但是,无论出于何种原因,它都没有更改global.asax文件中
标记的
Inherits=“
属性中的名称空间引用。它引用了一个旧版本的DLL,所以我的应用程序甚至没有被调用


一旦我更改了引用,一切都开始按计划工作。

这是MVC 5或ASP.NET Core MVC的解决方案吗?此外,我不需要默认路径。在我的例子中,我的“一网打尽”是默认路径。这段代码会去哪里?Global.asax.cs?RouteConfig.cs(在App_Start下)?您只能复制路由,但是的,它通常位于
Startup.cs
中,我很确定您的解决方案适用于ASP.NET 5(MVC 6)。startup.cs中的app对象在MVC 5中没有“UseMvc”方法,或者我的配置中有一些非常糟糕的东西,因为我没有看到它。显示你的
RouteConfig.cs
文件我将在上面添加它。