2012-06-11 26 views
8

引用控制器我碰到this寶石,這似乎是接近我想要的東西。但是,我想使用已引用程序集中的已編寫控制器。自託管的WebAPI應用程序從不同的裝配

我第一次破裂是引用的程序集,設置路由規則中原來一樣的WebAPI項目去,但我得到400S每次我嘗試調用自託管服務時間。我已經通過Fiddler的內容挑選了內容,除了地址差異之外,針對webAPI項目和自託管項目的請求是相同的。

我覺得這應該是相對簡單的,但我還沒有找到一個可以接受的答案。

+0

由於OP顯然已經放棄了這一問題,有其他人證實無論是提出的解決方案? –

+0

未放棄,我從來沒有解決問題的WebAPI版本解決問題。 – Ross

+1

我剛剛驗證了@cypressx提出的建議,它的工作方式如上所述。謝謝。 –

回答

5

這似乎是一個已知的問題。您必須強制.NET使用您需要的控制器加載程序集。

之前自承載Web API,你應該檢索要在運行時加載參考大會類型。就像這樣:

Type controllerType = typeof(ReferencedControllers.ControllerType); 

這應該從這個程序集加載控制器,它不會給你404錯誤。

+0

我已經確認這是正確的信息。我的步驟:(1)創建新的MVC4項目,(2)創建新的類庫項目,(3)將MVC4 WebAPI NuGet包添加到類庫項目中(4)從Web項目中引用類庫(5)將Web API控制器添加到類庫項目(5)使用類似於上述建議代碼的行修改'''Application_Start'''。我可以導航到類庫項目中定義的webapi控制器,所有請求都按預期運行。 –

+0

似乎適用於當前版本的WebAPI。謝謝,肖恩! – Ross

+0

您的注意,該行:類型controllerType = typeof(ReferencedControllers。ControllerType);只能在調試模式下工作,在發佈優化時忽略它.. – Janushirsha

3

link救了我的一天同樣的問題:)...

我只需要改變以下聲明,以適應該selfhost的WebAPI配置。

GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver()); 

var config = new HttpSelfHostConfiguration("http://localhost:8081"); 
     config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver()); 
+0

此鏈接保存了一天.....我有MS「簡單的例子」,不分層。謝謝! – granadaCoder

8

上一頁普利文和Janushirsha的帖子引我到正確的方向我繼續在這裏:

HttpConfiguration config = new HttpConfiguration(); 
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver()); 

// Not reliable in Release mode : 
Type controllerType = typeof(ReferencedControllers.ControllerType); 

所以,你應該用替換IAssembliesResolver

下面是CustomAssembliesResolver

using System.Web.Http.Dispatcher; 
internal class CustomAssembliesResolver : DefaultAssembliesResolver 
{ 
    public override ICollection<System.Reflection.Assembly> GetAssemblies() 
    { 
     var assemblies = base.GetAssemblies(); 

     // Interestingly, if we push the same assembly twice in the collection, 
     // an InvalidOperationException suggests that there is different 
     // controllers of the same name (I think it's a bug of WebApi 2.1). 
     var customControllersAssembly = typeof(AnotherReferencedAssembly.MyValuesController).Assembly; 
     if (!assemblies.Contains(customControllersAssembly)) 
      assemblies.Add(customControllersAssembly); 

     return assemblies; 
    } 
} 

此代碼實現的一個例子,如果第三方組件沒有被引用可以很容易地進行調整,或者如果你想晚集綁定。

希望得到這個幫助。

+1

這幫助了很多。謝謝!我認爲這應該是被接受的答案。 –

+0

感謝您的評論。樂意效勞。 –

+0

我很努力去理解你的例子。我正在製作一個啓動webApi服務的組件。我想從外部應用程序注入控制器。這可能嗎?它似乎只是神奇地發現控制器在它自己的項目中? (我不知道它是如何與這些... ...某種幕後反射魔術) –

相關問題