2011-07-26 71 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

相關問題