ASP.NET MVC5应用程序catch-all路由被忽略

时间:2016-06-23 16:15:18

标签: angular asp.net-mvc-5 routing angular2-routing

我开发了一个将在ASP.NET MVC 5应用程序中托管的Angular 2 spa。我希望每个请求转到单个路由 - / home / index - 所以我删除了默认路由并将其替换为全能:

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

这是RouteConfig.cs文件中的唯一路由。

如果我在没有任何路径值的情况下点击我的应用程序超过服务器URL,请执行以下操作:

http://myserver.org/

然后一切正常。如果我尝试点击这样的网址:

http://myserver.org/sectionname

应用程序返回404。

我已经安装了Phil Haack的Route Debugger NuGet包来尝试和诊断它,调试器告诉我asp.net默认路由 - 我已经删除 - 匹配我的url。事实上,我甚至没有看到全能路由,至少不是因为我在调试器生成的“所有路由”表中定义它(它显示{* catchall}而不是{* anything})。

MVC似乎忽略了我的RouteConfig文件。

  • 有什么想法发生了什么?
  • 我不认为默认路由是在Web应用程序本身之外的任何地方定义的。我需要清除路线表吗?
  • 在我对RouteConfig进行更改之前,是否可以从我的早期版本之一的某处缓存某些内容?

更新1:

这是完整的RouteConfig.cs文件: public static void RegisterRoutes(RouteCollection routes)

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:

在绝望的行为中,我去添加了两个新的控制器以匹配默认路由 - 我们称之为“Path1”和“Path2” - 以匹配默认控制器({controller} / {action} / { id})即使在远程ROUTECONFIG文件中也没有,但MVC仍然在匹配时保持不变。这适用于我的基本案例(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”的非常简单的处理程序,它返回我的自定义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");
        }
    }
}

异常永远不会被击中。好的旧默认路由 - 在配置中不存在 - 仍然可以正常工作。

我到底做错了什么?!?!?!?!?

2 个答案:

答案 0 :(得分:1)

事实证明,这很奇怪。我从最初创建项目时更改了Web应用程序的名称空间,并使用了ReSharper的adjust namespaces重构工具来调整整个项目中的名称空间。但是,无论出于何种原因,它都没有更改global.asax文件中Inherits=""标记的<Application />属性中的命名空间引用。它引用了旧版本的DLL,所以我的Application_Start甚至没有被调用。

一旦我改变了参考,一切都按计划开始了。

答案 1 :(得分:0)

试试这个:

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

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