Можно ли динамически создавать маршруты в .NET 4?

В нашем приложении мы используем новую систему маршрутизации .NET 4 для маршрутизации определенных запросов на другие части сайта. Нам разрешено публиковать наш код сайта в поздние вечера, а это значит, что мы должны опаздывать на работу, чтобы публиковать любые изменения кода. Нам часто приходится создавать пользовательские маршруты для поддержки устаревших ссылок на старый контент и перенаправления их на новый контент. Они часто необходимы сразу и по мере того, как наши маршруты определяются в скомпилированном global.asax, мы оказываемся в тупике, когда мы нуждаемся в этих прямых действиях, но не можем делать код.

Есть ли способ, которым мы могли бы определить маршруты в каком-то файле конфигурации, и чтобы сайт читал их программно без перезапуска приложения?

Ответ 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 (не нужно ссылаться). И, как я знаю, ничто не мешает вам добавлять новые маршруты, добавляя dll, которая содержит новые маршруты при реализации IRouteRegistrator в папку bin приложения. Таким образом, вы можете добавлять новые маршруты "на лету", не рискуя остальным приложением (новая dll легко удаляется, если что-то неожиданное происходит).

Если вы не можете или не будете использовать MVC Turbine, вы можете использовать эту концепцию для "извлечения" регистрации маршрута во внешнюю dll путем передачи коллекции маршрутов из global.asax в динамически загружаемую библиотеку, содержащую (только) класс с метод регистрации маршрута.

При этом (MVCTurbine или нет) в качестве отправной точки, если необходимо, вы можете легко прочитать файл конфигурации xml или txt в цикле foreach для общих маршрутов, но этот метод будет ограничен простыми маршрутами, поскольку он является сложным (сложным, но не невозможно) представить более сложную конфигурацию маршрута в тексте.