问题背景:在使用普通的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引用可以移除。 |
至此,解决这个问题。