問題背景:在使用普通的SelfHost時,調用其它工程的dll(其實就是把WebApi寫到一個單獨的工程方便管理),通過載入其他工程的dll然後再訪問webapi是沒有問題的。 但是在使用Owin SelfHost時,調用其它工程的dll,訪問WebApi時會拋出No type was found ...
問題背景:在使用普通的SelfHost時,調用其它工程的dll(其實就是把WebApi寫到一個單獨的工程方便管理),通過載入其他工程的dll然後再訪問webapi是沒有問題的。
但是在使用Owin SelfHost時,調用其它工程的dll,訪問WebApi時會拋出No type was found that matches the controller named 'Contacts',這是因為調用其它工程的dll時,我們需要告訴Owin SelfHost我們要用這個dll,怎麼告訴他呢,使用普通的SelfHost那種方法是不可行的,經過各種試驗,最後解決方案如下:
序號 |
過程描述 |
1 |
在其他工程中(如OwinSelftHost_webApi)新增一個繼承自DefaultAssembliesResolver的類如:AssembliesResolver,重寫基類的GetAssemblies方法,重寫的內容如下:
public override ICollection<Assembly> GetAssemblies() { ICollection<Assembly> baseAssemblies = base.GetAssemblies(); List<Assembly> assemblies = new List<Assembly>(baseAssemblies); var assembly = AppDomain.CurrentDomain.BaseDirectory; string path = assembly + "\\" + "OwinSelftHost_webApi.dll"; var controllersAssembly = Assembly.LoadFrom(path); baseAssemblies.Add(controllersAssembly); return assemblies; } |
2 |
在Owin SelfHost工程的Startup文件中的Configuration方法新增以下代碼: config.Services.Replace(typeof(IAssembliesResolver), new AssembliesResolver()); 註:此代碼應位於HttpConfiguration實例化後且在config.Routes.MapHttpRoute之前。 |
3 |
其他工程中(如OwinSelftHost_webApi)的System.Net.Http.Formatting、System.Web.Http,兩個引用需要註意,要引用最新的5.2.3.0,System.Web引用可以移除。 |
至此,解決這個問題。