Baz*_*zzz 5 c# asp.net routetable global-asax
在我的Global.asax文件中,Application_Start我RouteTable.Routes通过循环遍历从数据库收集的网页列表来创建一定数量的路由.这很好,所有路线都是根据需要创建和运行的.但是在我的Web应用程序中,用户可以修改数据库,从而修改网页集合.这意味着在应用程序的生命周期中,某些路由变为无效,并且应添加新路由.
我想做的是:当用户将某些内容更改为网页集时,我想清除RouteTable并通过再次循环遍历(修改过的)网页集来重新加载它.
不幸的是,Application_Startin Global.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
}
Run Code Online (Sandbox Code Playgroud)
在Global.asax中:
protected virtual void Application_Start(object sender, EventArgs e)
{
foreach (WebPageInfo webPageInfo in webPageInfos)
{
RouteTable.RegisterRoute(webPageInfo.Title, webPageInfo.Url, webPageInfo.PhysicalFile);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在应用程序的生命周期中用户可以添加/修改/删除记录webPageInfos,如何使用这些更改来更新RouteTable?
usbsnowcrash的答案朝着正确的方向前进.您已经知道如何加载RouteTable信息,因此不是将该代码直接烘焙到Application_Start方法中,而是将其放入可以调用的单独方法中 - 可能类似于RegisterRoutes.该Application_Start方法将调用RegisterRoutes以执行初始加载.在将更改写入页面集合的代码中,在提交更新后,调用RegisterRoutes以重新加载RouteTable.
你需要包含一些线程安全调用,例如RouteTable.Routes.GetWriteLock(),你还需要在从数据源重新加载所有内容之前清除路由(如usbsnowcrash所述).
我已经看到这种技术与"Bootstrapper"类一起使用,它提供了一个static(Shared在VB中)可以根据需要调用的方法.诀窍是使它成为与方法分离的Application_Start方法,以便您可以执行代码而不必仅依赖于应用程序生命周期.确保包含"清除"调用,以便在每次调用方法时从头开始.