来自不同程序集的自托管Web API应用程序引用控制器

时间:2012-06-11 23:30:16

标签: .net asp.net-web-api self-hosting

我遇到了this宝石,这似乎与我想要的很接近。但是,我想使用已引用的程序集中已编写的控制器。

我的第一个破解是引用程序集,设置路由规则与原始webAPI项目相同并且去,但每次尝试调用自托管服务时我都会得到400。我已经用Fiddler选择了请求的内部,除了地址差异之外,对webAPI项目和自托管项目的请求是相同的。

我觉得这应该是相对简单的,但我没有找到一个可以接受的答案。

3 个答案:

答案 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());