我的应用程序是一个非常简单的带有多个控制器的MVC 5网站。我有一个Home控制器,它具有这样的Index操作:
public ActionResult Index(string token)
{
DoSomethingWithTheToken(token);
return View();
}
现在,假设我的网站是www.my-special-website.com,我希望通过索引方法为 www.my-own-purpose-website.com/abcdefghijklmno 服务。
根据https://msdn.microsoft.com/en-us/library/cc668201.aspx中的可用信息,我设置了以下路线:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Home",
url: "{token}",
defaults: new { controller = "Home", action = "Index", token = "{token}" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
不幸的是,当我导航到 www.my-special-website.com/abcdefghijklmno 时,收到“ 404资源未找到”响应。
谁能使它降落到所需的控制器并传递令牌参数?
答案 0 :(得分:1)
我认为您收到定义路由的 404 错误是因为您已将应用程序的路由定义为:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "myroute",
url: "{token}",
defaults: new { controller = "Home", action = "MyIndex", token = "{token}" }
);
}
您可以将其用作:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name:"myroute",
url:"{token}",
defaults: new { controller = "Home", action = "MyIndex", token = "{token}" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
注1::添加到路由表中的路由的顺序很重要。我们的新自定义路由应在现有默认路由之前添加。如果您颠倒了顺序,则总是会调用默认路由,而不是自定义路由。
注意2::如果将路由定义为url:{token}
将会引起问题,因为所有传入的路由都只是控制器名称ex: www.mywebsite.com/Home
,这里是{{1} }将被视为令牌。因此,为了处理这种情况,大多数人都会在有或没有Identity Server的情况下使用filters之类的Authentication filters。这是how to add an authentication filter的基本实现。