引用控制器我碰到this寶石,這似乎是接近我想要的東西。但是,我想使用已引用程序集中的已編寫控制器。自託管的WebAPI應用程序從不同的裝配
我第一次破裂是引用的程序集,設置路由規則中原來一樣的WebAPI項目去,但我得到400S每次我嘗試調用自託管服務時間。我已經通過Fiddler的內容挑選了內容,除了地址差異之外,針對webAPI項目和自託管項目的請求是相同的。
我覺得這應該是相對簡單的,但我還沒有找到一個可以接受的答案。
引用控制器我碰到this寶石,這似乎是接近我想要的東西。但是,我想使用已引用程序集中的已編寫控制器。自託管的WebAPI應用程序從不同的裝配
我第一次破裂是引用的程序集,設置路由規則中原來一樣的WebAPI項目去,但我得到400S每次我嘗試調用自託管服務時間。我已經通過Fiddler的內容挑選了內容,除了地址差異之外,針對webAPI項目和自託管項目的請求是相同的。
我覺得這應該是相對簡單的,但我還沒有找到一個可以接受的答案。
這似乎是一個已知的問題。您必須強制.NET使用您需要的控制器加載程序集。
之前自承載Web API,你應該檢索要在運行時加載參考大會類型。就像這樣:
Type controllerType = typeof(ReferencedControllers.ControllerType);
這應該從這個程序集加載控制器,它不會給你404錯誤。
我已經確認這是正確的信息。我的步驟:(1)創建新的MVC4項目,(2)創建新的類庫項目,(3)將MVC4 WebAPI NuGet包添加到類庫項目中(4)從Web項目中引用類庫(5)將Web API控制器添加到類庫項目(5)使用類似於上述建議代碼的行修改'''Application_Start'''。我可以導航到類庫項目中定義的webapi控制器,所有請求都按預期運行。 –
似乎適用於當前版本的WebAPI。謝謝,肖恩! – Ross
您的注意,該行:類型controllerType = typeof(ReferencedControllers。ControllerType);只能在調試模式下工作,在發佈優化時忽略它.. – Janushirsha
這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());
此鏈接保存了一天.....我有MS「簡單的例子」,不分層。謝謝! – granadaCoder
上一頁普利文和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;
}
}
此代碼實現的一個例子,如果第三方組件沒有被引用可以很容易地進行調整,或者如果你想晚集綁定。
希望得到這個幫助。
這幫助了很多。謝謝!我認爲這應該是被接受的答案。 –
感謝您的評論。樂意效勞。 –
我很努力去理解你的例子。我正在製作一個啓動webApi服務的組件。我想從外部應用程序注入控制器。這可能嗎?它似乎只是神奇地發現控制器在它自己的項目中? (我不知道它是如何與這些... ...某種幕後反射魔術) –
由於OP顯然已經放棄了這一問題,有其他人證實無論是提出的解決方案? –
未放棄,我從來沒有解決問題的WebAPI版本解決問題。 – Ross
我剛剛驗證了@cypressx提出的建議,它的工作方式如上所述。謝謝。 –