Angular 忽略ASP.NET MVC5应用程序捕获所有路由
我正在开发一个Angular 2 spa,它将托管在ASP.NET MVC 5应用程序中。我希望每个请求都指向一个路由-/home/index-因此我删除了默认路由,并将其替换为一个catch-all: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文件中的唯一路
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之前,是否可以缓存我早期构建中的某个地方
- 此项目在ASP.NET 4.6.1下运行
- 此项目中没有身份验证(在此项目之外处理)
- 我在项目中的任何地方都没有任何OWIN配置(没有startup.cs、没有startup.auth.cs等)
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
文件我将在上面添加它。