5

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

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

不幸的是,Application_StartinGlobal.asax只运行一次,即在应用程序开始时。我尝试将其移动到由于静态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?

4

2 回答 2

6

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

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

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

于 2011-02-24T16:07:44.250 回答
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
于 2011-02-19T23:50:41.800 回答