2012-06-11 24 views
8

引用控制器我碰到this宝石,这似乎是接近我想要的东西。但是,我想使用已引用程序集中的已编写控制器。自托管的WebAPI应用程序从不同的装配

我第一次破裂是引用的程序集,设置路由规则中原来一样的WebAPI项目去,但我得到400S每次我尝试调用自托管服务时间。我已经通过Fiddler的内容挑选了内容,除了地址差异之外,针对webAPI项目和自托管项目的请求是相同的。

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

+0

由于OP显然已经放弃了这一问题,有其他人证实无论是提出的解决方案? –

+0

未放弃,我从来没有解决问题的WebAPI版本解决问题。 – Ross

+1

我刚刚验证了@cypressx提出的建议,它的工作方式如上所述。谢谢。 –

回答

5

这似乎是一个已知的问题。您必须强制.NET使用您需要的控制器加载程序集。

之前自承载Web API,你应该检索要在运行时加载参考大会类型。就像这样:

Type controllerType = typeof(ReferencedControllers.ControllerType); 

这应该从这个程序集加载控制器,它不会给你404错误。

+0

我已经确认这是正确的信息。我的步骤:(1)创建新的MVC4项目,(2)创建新的类库项目,(3)将MVC4 WebAPI NuGet包添加到类库项目中(4)从Web项目中引用类库(5)将Web API控制器添加到类库项目(5)使用类似于上述建议代码的行修改'''Application_Start'''。我可以导航到类库项目中定义的webapi控制器,所有请求都按预期运行。 –

+0

似乎适用于当前版本的WebAPI。谢谢,肖恩! – Ross

+0

您的注意,该行:类型controllerType = typeof(ReferencedControllers。ControllerType);只能在调试模式下工作,在发布优化时忽略它.. – Janushirsha

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()); 
+0

此链接保存了一天.....我有MS“简单的例子”,不分层。谢谢! – granadaCoder

8

上一页普利文和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; 
    } 
} 

此代码实现的一个例子,如果第三方组件没有被引用可以很容易地进行调整,或者如果你想晚集绑定。

希望得到这个帮助。

+1

这帮助了很多。谢谢!我认为这应该是被接受的答案。 –

+0

感谢您的评论。乐意效劳。 –

+0

我很努力去理解你的例子。我正在制作一个启动webApi服务的组件。我想从外部应用程序注入控制器。这可能吗?它似乎只是神奇地发现控制器在它自己的项目中? (我不知道它是如何与这些... ...某种幕后反射魔术) –

相关问题