在我们的应用程序中,我们使用新的.NET 4路由系统将某些请求路由到站点的其他部分。我们只允许在晚上发布我们的网站代码,这意味着我们必须迟到才能发布任何代码更改。我们经常需要创建自定义路由以支持旧内容的旧链接并将其路由到新内容。这些通常是需要的,因为我们的路由是在编译的global.asax中定义的,当我们立即需要这些时,我们就会陷入僵局,但不能进行代码推送。
有没有办法可以在某种配置文件中定义路由,让网站以编程方式读取它们而无需重新启动应用程序?
答案 0 :(得分:1)
由于配置文件的更改需要重新启动应用程序(即使不会,路由仅在启动时注册,而不是在每个请求上注册),我不明白为什么路由注册(开始?)不能在库“仅用于路由”(Routes.dll)?
我一直在使用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实现中的新路由到应用程序的bin文件夹的dll。这样,您可以“动态”添加新路由,而不会有其他应用程序的风险(如果发生意外情况,可以轻松删除新的dll。)
如果您不能或不会使用MVC Turbine,您可以使用此概念通过将路径集合从global.asax传递到动态加载的库(包含(仅))类来“提取”路由注册到外部dll路线登记方法。
以此(MVCTurbine与否)为起点,如果需要,您可以轻松地将xml或txt配置文件读入foreach循环中以获取常用路由,但该方法仅限于简单路由,因为它很难(复杂,但是并非不可能)在文本中表示任何更复杂的路线配置。