2011-07-26 49 views
10

在我们的应用程序中,我们使用新的.NET 4路由系统将某些请求路由到网站的其他部分。我们只允许在晚上发布我们的网站代码,这意味着我们必须迟到才能发布任何代码更改。我们经常需要创建自定义路线来支持旧内容的旧链接并将它们路由到新内容。这些通常是马上需要的,由于我们的路由是在编译的global.asax中定义的,当我们需要这些直接生存但不能执行代码推送时,我们会陷入僵局。是否可以在.NET 4中动态创建路由?

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

+0

与问题没有直接关系,但您是否考虑过持续集成的自动部署?这些可以帮助你回到家庭时间。 – Jordan

+0

@Jordan我们有很多事情我们考虑用于部署改进,但是我没有直接控制这一点。我们在发布时必须在此处,以确保活动服务器上没有任何中断。我希望我们能够加入TeamCity,并使其自动化,但这不是我的呼叫。这些都不能解决需要立即抛出路由的问题,因为它们仍然需要等到自动发布。 – Chev

回答

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 
     } 
    } 

这个类并不一定是Web用户界面项目的一部分,但可以在单独的DLL。 MVCTurbine自动加载(并调用)位于bin文件夹(不必被引用)库中的IRouteRegistrator和IServiceRegistrator的所有实现。而且,据我所知,没有什么能阻止你通过添加包含新路由的IRF来添加新路由,以实现IRouteRegistrator到应用程序的bin文件夹。这样,您就可以“即时”添加新路线,而不会冒其他应用程序的风险(如果发生意外情况,新的dll很容易被移除)。

如果你不能或不愿意使用MVC Turbine,你可以使用这个概念,通过从global.asax传递路由集合到动态加载的库来“提取”路由注册到外部dll,包含(仅)类用路由注册的方法。如果需要,您可以轻松地将xml或txt配置文件读入到常见路由的foreach循环中,但该方法仅限于简单路由,因为它很难(复杂的,但并非不可能)以文本形式表示任何更复杂的路由配置。

+1

是的,我有点害怕“由于配置文件的更改需要重新启动应用程序”。不幸的是,这是我们白天无法推送的全部原因,我们不允许重新启动应用程序。这是一个内部网站,员工使用它来完成他们的工作。重新启动它往往会导致他们悲伤。不过谢谢你的回答,编译我们的路线到一个单独的dll可能是有用的。 – Chev

+0

不知道是否有可能,但每个请求的路由注册可能会花费您大量的性能。那么,如果你使用mvc,会话不应该包含任何数据,并且如果你启用了基于cookie的认证,那么不应该很少重新开始是非常无害的? :) 无论如何,希望你可以发送邮件到“allstaff”注意到服务器重启将在x时钟,请保存你的工作... 我想管理层需要决定什么是更大的紧急情况 - 正在进行的工作或新的路线:S –

+0

同意,这是一条沙滩上的强硬路线,几乎没有妥协的余地。除非有人有更好的答案,否则管理层将不得不意识到这一事实,并且他们可以决定对他们更重要的事情。感谢obrad。 – Chev

相关问题