动态创建的路由仅在重新初始化应用程序时才有效

时间:2015-09-05 02:51:32

标签: c# asp.net-mvc routing asp.net-mvc-5

在我的网络应用程序“子网站”中,页面即时创建。每当创建新子网站时,或者(有时)创建新页面时,路径都会添加RouteTable.Routes。像这样:

public static Site RegisterSite(Site site) {
    DeregisterSite(site);

    // Register non-auto-routed pages first so the default route doesn't override them.
    foreach (SitePage page in site.SitePages.Where(o => !o.IsAutoRouted))
        RegisterPageRoute(site, page);

    RegisterDefaultRoute(site);

    return site;
}

// Both RegisterPageRoute and RegisterDefaultRoute eventually make it here...
private static Route RegisterRoute(int siteId, string routeName, Route route) {
    using (RouteTable.Routes.GetWriteLock()) {
        RouteTable.Routes.Add(routeName, route);
    }

    return route;
}

我已经调试了新网站的创建,并且在创建网站时,路由已正确注册(RouteTable.Routes包含新路由)。如果我然后尝试浏览将由新路由服务的URL,它们永远不会到达应该为它们提供服务的控制器 - 我得到一个硬IIS错误页面:

  

无法找到资源。

那么,如果要添加路由,当MVC框架收到其中一条新路由的请求时,为什么它们不被“看到”?我在某处错过了一步吗?我是否需要告诉MVC框架“重新加载”路由表?

1 个答案:

答案 0 :(得分:0)

在我的情况下,路线按此顺序添加:

  1. 基于网站的路线(非常具体)
  2. 根主页(不具体)
  3. 因此路由工作正常,首次加载,但新路由被添加到路由表的末尾,在非特定的"其他路由"之后。因此,非特定路线一旦被击中就会收到所有请求。

    解决方案很简单:

    1. 不要创建非特定路线,或
    2. 添加新网站/页面时,按正确顺序重建整个路径表,或
    3. 确保将新的网站/网页路由添加到路由表的顶部:RouteTable.Routes.Insert(0, newRoute)