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

标签 c# asp.net-mvc routes 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,它们永远不会到达应该为它们提供服务的 Controller ——我得到一个硬 IIS 错误页面:

The resource cannot be found.

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

最佳答案

在我的例子中,路由是按以下顺序添加的:

  1. 基于站点的路线(非常具体)
  2. 根主页(不具体)

因此路由正常工作,在第一次加载时,但新路由被添加到路由表的末尾,在非特定的“其他路由”之后。因此,该非特定路由一旦被命中,就会接收所有请求。

解决方案很简单,要么:

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

关于c# - 动态创建的路由仅在应用程序重新初始化时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32409037/

相关文章:

c# - 从 C# 插入到 msi 数据库

javascript - 我没有从 Angular 前端访问后端 Controller 中的 api 路由。我做错了什么?

asp.net-mvc - @ : mean in ASP.net MVC Razor 是什么?

c# - 使用 MySQL 作为数据库从模型生成数据库

javascript - 这两种语法在声明导出变量时有什么区别?

mysql - Nodejs Express/路线和 mysql

c# - 在C#中获取用户IP

c# - MVC 4 重用 View 和 View 模型最佳实践

jquery - 动态 HTML 表单

symfony - 如何修复 Symfony 3.4 上的 'Uncaught PHP Exception Twig_Error_Loader: Unable to find template'?