【问题标题】:how to reload RouteTable when web page collection has changed?网页集合发生变化时如何重新加载RouteTable?
【发布时间】:2011-02-05 08:04:15
【问题描述】:

Application_Start 上的Global.asax 文件中,我通过循环访问从数据库收集的网页列表,在RouteTable.Routes 中创建了一定数量的路由。这工作正常,所有路线都已创建并根据需要运行。但在我的 Web 应用程序中,用户可以修改数据库,从而修改网页的集合。这意味着在应用程序的生命周期中,某些路由会失效,需要添加新的路由。

我希望做的是:当用户对网页集合进行更改时,我想清除 RouteTable 并通过再次循环(修改后的)网页集合来重新加载它。

不幸的是,Global.asax 中的 Application_Start 只运行一次,即在应用程序的开头。我尝试将其移至Session_Start,由于RoutesTable 是静态的,这会导致不良行为。

如何让我的用户能够即时更改网页集合,同时让静态 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:感谢您的评论。您的意思是在“匹配路由”和“重定向到物理文件”之间添加一些功能?然后让每个请求都匹配* 路由并让这个中间层进行重定向?如果是这样,您能否就如何实施这种方法给我一些指导?

标签: c# asp.net global-asax routetable


【解决方案1】:

usbsnowcrash 的答案正朝着正确的方向发展。您已经知道如何加载RouteTable 信息,因此不要将该代码直接烘焙到Application_Start 方法中,而是将其放入可以调用的单独方法中——可能类似于RegisterRoutesApplication_Start 方法将调用 RegisterRoutes 来执行初始加载。在将更改写入 pages 集合的代码中,提交更新后,调用 RegisterRoutes 重新加载 RouteTable。

您需要包含一些线程安全调用,例如 RouteTable.Routes.GetWriteLock(),并且您还需要在从数据源重新加载所有内容之前清除路由(如 usbsnowcrash 所述)。

我已经看到这种技术与“Bootstrapper”类一起使用,该类提供了一个可以根据需要调用的static(VB 中的Shared)方法。诀窍是使它成为一个独立于Application_Start 方法的方法,这样您就可以执行代码而无需完全依赖应用程序生命周期。确保包含“清除”调用,以便在每次调用该方法时都从​​头开始。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 2019-01-05
      • 1970-01-01
      • 2012-06-10
      • 2017-12-30
      • 2013-07-16
      • 2020-04-08
      • 2012-11-14
      相关资源
      最近更新 更多