在我们的应用程序中,我们使用新的 .NET 4 路由系统将某些请求路由到站点的其他部分。我们只允许在深夜发布我们的站点代码,这意味着我们必须加类到很晚才能发布任何代码更改。我们经常需要创建自定义路由来支持指向旧内容的旧链接并将它们路由到新内容。这些通常是立即需要的,并且由于我们的路由是在编译的 global.asax 中定义的,因此当我们立即需要这些实时但无法进行代码推送时,我们陷入了僵局。
有没有一种方法可以让我们在某种配置文件中定义路由,并让站点以编程方式读取它们而无需重新启动应用程序?
最佳答案
由于更改配置文件需要重新启动应用程序(即使不需要,路由仅在启动时注册,而不是在每次请求时注册),我不明白为什么路由注册(开始?)不能在库“仅用于路由”(Routes.dll)?
我一直在使用支持自动依赖注入(inject)/服务注册和路由注册的 MVCTurbine。我使用这样的类进行路由注册:
public class RouteRegistrator : MvcTurbine.Routing.IRouteRegistrator
{
/// <summary>
/// Registers routes within <see cref="T:System.Web.Routing.RouteCollection"/> for the application.
/// </summary>
/// <param name="routes">The <see cref="T:System.Web.Routing.RouteCollection"/> from the <see cref="P:System.Web.Routing.RouteTable.Routes"/>.</param>
public void Register(System.Web.Routing.RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "MyNamespace.Controllers" }); // Parameter defaults
}
}
这个类不必是webui项目的一部分,但可以在单独的dll中。 MVCTurbine 自动加载(和调用)所有 IRouteRegistrator 和 IServiceRegistrator 的实现,它们位于 bin 文件夹的库中(不必引用)。而且,据我所知,没有什么可以阻止您通过将 IRouteRegistrator 的实现中包含新路由的 dll 添加到应用程序的 bin 文件夹来添加新路由。通过这种方式,您可以“即时”添加新路由,而不会危及应用程序的其余部分(如果发生意外情况,可以轻松删除新的 dll)。
如果你不能或不愿使用 MVC Turbine,你可以使用这个概念通过将路由集合从 global.asax 传递到动态加载的库,将路由注册“提取”到外部 dll,包含(仅)类路由注册方法。
以此(MVCTurbine 或非 MVCTurbine)为起点,如果需要,您可以轻松地将 xml 或 txt 配置文件读入 foreach 循环以获取公共(public)路由,但该方法将仅限于简单路由,因为它很难(复杂,但并非不可能)以在文本中表示任何更复杂的路由配置。
关于c# - 是否可以在 .NET 4 中动态创建路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834112/