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

Posted

技术标签:

【中文标题】是否可以在 .NET 4 中动态创建路由?【英文标题】:Is it possible to create routes dynamically in .NET 4? 【发布时间】:2011-10-13 15:06:19 【问题描述】:

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

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

【问题讨论】:

与问题没有直接关系,但您是否考虑过具有持续集成的自动化部署?这些可以帮助您重回家庭时光。 @Jordan 我们考虑了很多用于部署改进的事情,但我对此没有直接的控制权。当我们发布时,我们必须在这里,以确保实时服务器上没有任何中断。我希望我们加入 TeamCity 并让它自动化,但这不是我的决定。这些都不能解决需要即时抛出路线的问题,因为他们仍然必须等到自动发布。 【参考方案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 自动加载(并调用)位于 bin 文件夹中的库中的 IRouteRegistrator 和 IServiceRegistrator 的所有实现(不必引用)。而且,据我所知,没有什么可以阻止您通过将包含 IRouteRegistrator 实现中的新路由的 dll 添加到应用程序的 bin 文件夹来添加新路由。这样,您可以“即时”添加新路由,而不会危及应用程序的其余部分(如果发生意外情况,可以轻松删除新的 dll)。

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

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

【讨论】:

是的,我有点害怕“因为更改配置文件需要重新启动应用程序”。不幸的是,这就是我们不能在白天推送的全部原因,我们不允许重新启动应用程序。这是一个内部站点,员工使用它来完成工作。重新启动它通常会让他们感到悲伤。不过感谢您的回答,将我们的路由编译成单独的 dll 可能会很有用。 不确定这是否可行,但对每个请求进行路由注册可能会降低您的性能。好吧,如果您使用 mvc,会话不应包含任何数据,并且如果您启用了基于 cookie 的身份验证,那么 little restart 不应该是无害的吗? :) 无论如何,希望您可以向“allstaff”发送邮件,指出服务器将在 xo 时钟重新启动,请保存您的工作......我想管理层需要决定什么是更大的紧急情况 - 正在进行的工作或新的路线: S 同意,这是一条硬道理,几乎没有妥协的余地。除非有人有更好的答案,否则管理层必须意识到这一事实,他们可以决定什么对他们来说更重要。谢谢奥布拉德。 您可能想查看此资源forums.asp.net/p/1526588/3684302.aspxali62b 发布了一个建议“catch-all”参数的答案,如果动态路由可以由一个通用路由(某些区域) 到“主”控制器,然后根据参数从那里重定向,但这实际上取决于您的场景。 有趣的想法。我将进一步探索。

以上是关于是否可以在 .NET 4 中动态创建路由?的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中动态创建刀片

在Gatsby JS中动态生成路由

是否可以创建具有动态签名的抽象方法?

在 React 中循环数据以创建“动态路由”

有没有办法在 Laravel 4 中混合静态路由和动态路由?

在 NextJS 中使用“getStaticPaths”和“getStaticProps”创建动态路由