我遇到了this宝石,这似乎与我想要的很接近。但是,我想使用已引用的程序集中已编写的控制器。
我的第一个破解是引用程序集,设置路由规则与原始webAPI项目相同并且去,但每次尝试调用自托管服务时我都会得到400。我已经用Fiddler选择了请求的内部,除了地址差异之外,对webAPI项目和自托管项目的请求是相同的。
我觉得这应该是相对简单的,但我没有找到一个可以接受的答案。
答案 0 :(得分:8)
以前Praveen和Janushirsha的帖子引导我走向正确的方向:
// Not reliable in Release mode :
Type controllerType = typeof(ReferencedControllers.ControllerType);
因此,您应该将IAssembliesResolver
替换为:
HttpConfiguration config = new HttpConfiguration();
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());
以下是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 :(得分:5)
这似乎是一个已知问题。您必须强制.NET使用您需要的控制器加载程序集。
在您自己托管Web API之前,您应该从参考程序集中检索要由运行时加载的类型。像这样:
Type controllerType = typeof(ReferencedControllers.ControllerType);
这应该从这个程序集加载控制器,它不会给你404错误。
答案 2 :(得分: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());