我在Asp.Net MVC 4項目中解決了404響應問題。它內置於VS2012目標4.5。404外部程序集中的控制器
我有預編譯的視圖和控制器內置到獨立的DLL。我可以動態加載DLL並從我的核心項目中檢查它們,甚至可以調用它們上的方法;但是,似乎MVC框架並不知道控制器。我在這裏,但有一些缺失。在控制器和視圖
控制器
背景是建立在一個獨立的MVC項目,並從Controller
繼承。那裏沒有太有趣的事情發生。視圖使用RazorGenerator併成爲生活在項目中的類。
該項目的輸出是一個正確包含控制器和視圖的DLL。
DLL在庫中的一個單獨的類(不是控制器的一部分)中實現了一個特定的接口,我們將其稱爲IPlugin
。
加載的DLL
運行在Visual Studio中管理我編譯我的應用程序,這是IIS下主辦。隨着項目的建成,我將一個插件DLL下載到我的「插件」目錄中。如果不進行調試(稍後會變得很重要),我打開IE並導航到該網站。 請注意,在這一點上,應用程序已經建成,但從未運行,所以啓動事件將觸發。如果我回收應用程序池,這裏的一切仍然一致。
我有一個Startup
類兩種方法,PreStart
PostStart
和分別使用WebActivator.PreApplicationStartMethod
和WebActivator.PostApplicationStartMethod
調用方法。
PreStart
是我做到以下幾點:
- 獲取所有插件的DLL文件在我的「插件」目錄
- 複製所有插件
AppDomain.CurrentDomain.DynamicDirectory
- 負載類型...如果它包含一個
IPlugin
我再- 裝配添加到BuildManager
- 調用一些方法對小鬼類lements IPlugin
在 '開始後' 我做這個代碼位(基於從RazorGenerator.Mvc代碼):
foreach (var assembly in Modules.Select(m=>m.Value))
{
var engine = new PrecompiledMvcEngine(assembly)
{
UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
};
ViewEngines.Engines.Insert(0, engine);
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
Modules
在該上下文中是一個鍵/值對,其中值是加載的程序集。此代碼的目的是通過爲每個知道如何解析視圖的組件添加視圖引擎(這是RazorGenerator的一部分)來確保MVC瞭解視圖。
我怎麼知道我關閉(但明顯缺乏雪茄)
IPlugin
定義了一個名爲RegisterRoutes
方法,其中,你猜對了,路都被註冊爲那些誰實現的接口。我在PreStart
中調用此方法,並添加了路由 - 我已驗證這些路由表存在於我的路由表中。例如,PreStart
期間在我的插件,通過該方法的動態調用創建定義的路線上,我看到這樣的事情作爲DataToken檢查我的路由時:
Namespaces = Plugin.Name.Controllers
因此,路由被註冊時,程序集已加載,我已驗證該DLL已正確複製到AppDomain的DynamicDirectory。我可以調用在運行時動態加載的類的成員。但是當我導航到路由匹配的URL時,我得到一個404。這是而不是 a「找不到視圖」YSOD,它更類似於根本找不到控制器。
這裏是混淆了我的部分:如果在這一點上,沒有做任何事情,我返回到Visual Studio並擊中F5 ...一切正常。
這就像Visual Studio以某種我無法識別的方式瞭解控制器,並且MVC框架正在採用它。
最後,一問
我缺少什麼,怎麼做我得到的MVC框架要知道我的控制器嗎?
嘿,在這一點上,如果你還在讀這個,謝謝。 :)
1. VS是否正在使用Cassini?嘗試將其更改爲IIS Express並檢查它是否繼續正常工作。 2.嘗試安裝[RouteDebugger](http://nuget.org/packages/routedebugger) - 也許它可能會給你一些線索是否正確註冊IIS – Pranav 2013-02-18 06:24:00
感謝@Pranav,但它已經在IIS上。路由調試器顯示路由正在工作。 – MisterJames 2013-02-18 17:12:25
這可能是一個問題? http://stackoverflow.com/questions/14971895/using-precompiledmvcengine-findview-throws-invalidoperationexception-and-looks-f – Tengiz 2013-02-22 17:29:01