是否可以在.NET 4中动态创建路由?

Che*_*hev 11 .net c# asp.net routing .net-4.0

在我们的应用程序中,我们使用新的.NET 4路由系统将某些请求路由到站点的其他部分.我们只允许在晚上发布我们的网站代码,这意味着我们必须迟到才能发布任何代码更改.我们经常需要创建自定义路由以支持旧内容的旧链接并将其路由到新内容.这些通常是需要的,因为我们的路由是在编译的global.asax中定义的,当我们立即需要这些实时但是无法执行代码推送时,我们会陷入僵局.

有没有办法我们可以在某种配置文件中定义路由并让网站以编程方式读取它们而无需重新启动应用程序?

Gor*_*vic 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

该类不必是 webui 项目的一部分,但可以位于单独的 dll 中。MVCTurbine 自动加载(并调用)bin 文件夹中的库中的 IRouteRegistrator 和 IServiceRegistrator 的所有实现(不必引用)。而且,据我所知,没有什么可以阻止您通过将 IRouteRegistrator 实现中包含新路由的 dll 添加到应用程序的 bin 文件夹来添加新路由。这样,您可以“即时”添加新路由,而不会危及应用程序的其余部分(如果发生意外情况,新的 dll 很容易被删除)。

如果您不能或不愿意使用 MVC Turbine,您可以使用此概念通过将路由集合从 global.asax 传递到动态加载的库(仅包含具有路由方法的类)来“提取”路由注册到外部 dll登记。

以此(无论是否为 MVCTurbine)为起点,如果需要,您可以轻松地将 xml 或 txt 配置文件读取到 foreach 循环中以获取常见路由,但该方法将仅限于简单路由,因为它很困难(复杂,但并非不可能)以文本形式表示任何更复杂的路由配置。