当网页集合更改时如何重新加载RouteTable?

4

在我的Global.asax文件中,在Application_Start事件中,我通过循环遍历从数据库中收集的Web页面列表,在RouteTable.Routes中创建一定数量的路由。这个方法可以正常工作,所有的路由都被创建并按要求工作。但是,用户可以修改数据库的内容,因此Web页面的集合也会发生变化。这意味着,在应用程序的生命周期内,一些路由变得无效,需要添加新的路由。

我的目标是:当用户更改Web页面集合时,我希望立即清除RouteTable并通过再次循环遍历(修改后的)Web页面集合重新加载它。

不幸的是,Global.asax中的Application_Start只运行一次,即在应用程序启动时。我尝试将它移到Session_Start中,但由于RoutesTable是静态的,结果会导致不希望出现的行为。

如何让用户能够在运行时更改Web页面集合而保持静态的RouteTable与之“同步”?

编辑

目前我做了类似下面的事情(伪代码):

public class WebPageInfo      // represents a record in the database
{
 public string Title;         //  My nice page
 public string Url;           //  NicePage 
 public string PhysicalFile;  //  ~/Page.aspx
}

在Global.asax文件中:
protected virtual void Application_Start(object sender, EventArgs e)
{
 foreach (WebPageInfo webPageInfo in webPageInfos)
 {
  RouteTable.RegisterRoute(webPageInfo.Title, webPageInfo.Url, webPageInfo.PhysicalFile);
 }
}

问题在于,在应用程序的生命周期中,用户可以添加/修改/删除webPageInfos记录,如何使用这些更改来更新RouteTable?

每当注意到变化时,使每个服务器自我回收是一种选择吗?但是,我想您是否应该改用默认的 * 路由作为一个全能路由并编写自己的分派器。 - Marc Gravell
@Marc:感谢您的评论。您是指在“匹配路由”和“重定向到物理文件”之间添加一些功能层吗?然后让每个请求都匹配*路由,并让这个中间层执行重定向操作?如果是这样,您能否给我一些方向,告诉我如何实现这种方法? - Bazzz
2个回答

5
usbsnowcrash 给出的答案朝着正确方向发展。已经知道如何加载 RouteTable 信息,因此不要直接将该代码写入 Application_Start 方法中,而是将其放入一个可以调用的单独方法中,例如 RegisterRoutesApplication_Start 方法将调用 RegisterRoutes 进行初始加载。在编写更改页面集合的代码中,在提交更新后调用 RegisterRoutes 重新加载 RouteTable。
您需要包括一些线程安全调用,例如 RouteTable.Routes.GetWriteLock(),并且还需要在从数据源重新加载之前清除路由(如 usbsnowcrash 所提到的)。
我见过使用“Bootstrapper”类的技术,该类提供了一个可以根据需要调用的静态 (Shared 在 VB 中) 方法。诀窍在于将其作为独立于 Application_Start 方法的方法,以便您可以在不仅依赖于应用程序生命周期的情况下执行代码。确保包括 "clearing" 调用,以便每次调用该方法时都从头开始。

2

RouteTable可以被替换。我的建议是设置一个轮询事件,每隔10分钟检查一次数据库,如果检测到更改,则替换路由表(确保将此代码设置为线程安全)。以下是更新代码的示例(假设AddAllRuleSets是您编写的函数,用于添加来自数据库的所有规则集)。

        'somewhat threadsafe
        With System.Web.Routing.RouteTable.Routes
            Using .GetWriteLock()
                routes.Clear()
                'readd routes from your db
                AddAllRulesets()
            End Using
        End With

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接