我开发了一个将在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文件。
更新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" });
}
}
}
我确实需要指出以下内容。
更新2:
在绝望的行为中,我去添加了两个新的控制器以匹配默认路由 - 我们称之为“Path1”和“Path2” - 以匹配默认控制器({controller} / {action} / { id})即使在远程ROUTECONFIG文件中也没有,但MVC仍然在匹配时保持不变。这适用于我的基本案例(http://myapp/path1
和http://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");
}
}
}
异常永远不会被击中。好的旧默认路由 - 在配置中不存在 - 仍然可以正常工作。
我到底做错了什么?!?!?!?!?
答案 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"});
});