【发布时间】:2013-06-27 20:57:29
【问题描述】:
是否可以在应用程序启动后添加/删除路由?
我想要做的是提供在管理系统中管理路由的能力,而无需重新启动 Web 应用程序。所以内容团队会根据自己的需要设置路由。
我们使用 ASP.NET 4 WebForms 应用程序。
【问题讨论】:
是否可以在应用程序启动后添加/删除路由?
我想要做的是提供在管理系统中管理路由的能力,而无需重新启动 Web 应用程序。所以内容团队会根据自己的需要设置路由。
我们使用 ASP.NET 4 WebForms 应用程序。
【问题讨论】:
这是可能的,但您需要编写自己的逻辑来处理路由收集和基于添加/删除到集合的更新。
下面的代码只是为了展示如何实现此类目标的基础知识。有很多方法可以动态存储和让用户更新路由。
在 Global.asax 中假设您有一些预定义的路线:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RegisterRoutes(RouteTable.Routes);
}
void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("RouteDirect", "about/{user}", "~/about.aspx");
}
现在 About.aspx 可以读取路由值了。
protected void Page_Load(object sender, EventArgs e)
{
if (Page.RouteData.Values["user"] != null)
{
TextBox1.Text = Page.RouteData.Values["user"].ToString();
}
}
如果您浏览到 localhost:51604/about/john 您将在文本框中看到 john。
以下是有关如何添加/删除路线的简单示例。您可以扩展此逻辑以满足您的需求,您可以在安全页面上为您的内容团队显示所有现有路由,并为他们提供添加/删除/禁用路由或使用更复杂的方式来指定路由参数等的能力。
protected void Button1_Click(object sender, EventArgs e)
{
//Adding New Route on Button Click
RouteTable.Routes.MapPageRoute("RouteDirectNew", "aboutnew/{user}", "~/about.aspx");
//Now route table has 2 routes:
// about/{user}
// aboutnew/{user}
}
protected void Button2_Click(object sender, EventArgs e)
{
//Removing new route on button click
RouteCollection rcollection = new RouteCollection();
rcollection = RouteTable.Routes;
Route ToDeleteRoute = null;
foreach (Route r in rcollection)
{
if (r.Url == "aboutnew/{user}")
ToDeleteRoute = r;
}
if(ToDeleteRoute != null)
RouteTable.Routes.Remove(ToDeleteRoute);
//Now route table has only 1 route the original added via global.asax:
// about/{user}
}
【讨论】:
根据MSDN,如果你想在Global.asax.cs的Application_start之外修改RouteTable.Routes,你需要获取Read/Write lock来保证它的线程安全。
所以上面的 Button2_Click 应该是这样的:
protected void Button2_Click(object sender, EventArgs e)
{
//Removing new route on button click
RouteCollection rcollection = new RouteCollection();
using (currentRoutes.GetReadLock())
{
rcollection = RouteTable.Routes;
}
Route ToDeleteRoute = null;
foreach (Route r in rcollection)
{
if (r.Url == "aboutnew/{user}")
ToDeleteRoute = r;
}
if(ToDeleteRoute != null)
{
using (currentRoutes.GetWriteLock())
{
RouteTable.Routes.Remove(ToDeleteRoute);
}
}
//Now route table has only 1 route the original added via global.asax:
// about/{user}
}
【讨论】: